Выбор ответа Senior Очереди, логи и микросервисы обновлено

Паттерн transactional outbox

Вопрос

Сервис сохраняет заказ в базу и отправляет событие в Kafka. Иногда заказ есть, а события нет. Какой паттерн решает проблему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Transactional outbox: событие пишется в базу в одной транзакции с заказом. Запись в базу и отправка в брокер это две разные системы, и между ними сервис может упасть.

Варианты ответа

  1. Отправлять событие перед сохранением заказа, а при ошибке записи слать отмену
  2. Увеличить число партиций, чтобы событие успевало уйти до таймаута
  3. Повторять отправку в цикле до успеха прямо в обработчике HTTP-запроса
  4. Transactional outbox: событие пишется в базу в одной транзакции с заказомправильный ответ

Разбор

Запись в базу и отправка в брокер это две разные системы, и между ними сервис может упасть. Outbox превращает отправку в запись в ту же базу и ту же транзакцию: либо есть и заказ, и событие, либо ничего, а отдельный процесс потом отправляет события из таблицы outbox в брокер. Отправка до сохранения даёт обратную проблему: событие без заказа, а отмена тоже может не уйти. Для тестировщика outbox удобен: по таблице видно, какие события не ушли.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.