Паттерн transactional outbox
Вопрос
Сервис сохраняет заказ в базу и отправляет событие в Kafka. Иногда заказ есть, а события нет. Какой паттерн решает проблему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Отправлять событие перед сохранением заказа, а при ошибке записи слать отмену
- Увеличить число партиций, чтобы событие успевало уйти до таймаута
- Повторять отправку в цикле до успеха прямо в обработчике HTTP-запроса
- Transactional outbox: событие пишется в базу в одной транзакции с заказомправильный ответ
Разбор
Запись в базу и отправка в брокер это две разные системы, и между ними сервис может упасть. Outbox превращает отправку в запись в ту же базу и ту же транзакцию: либо есть и заказ, и событие, либо ничего, а отдельный процесс потом отправляет события из таблицы outbox в брокер. Отправка до сохранения даёт обратную проблему: событие без заказа, а отмена тоже может не уйти. Для тестировщика outbox удобен: по таблице видно, какие события не ушли.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.