Выбор ответа Senior Кеш и очереди обновлено

Transactional outbox

Вопрос

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

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

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

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

Коротко

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

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

  1. Публиковать событие до коммита транзакции заказа
  2. Увеличить таймаут брокера и число повторов отправки
  3. Двухфазный коммит с брокером через Promise.all
  4. Transactional outbox: событие в таблицу той же транзакциейправильный ответ

Разбор

Запись в базу и отправка в брокер это две разные системы, атомарно их не сделать. Outbox сводит задачу к одной транзакции в базе, а публикация идёт отдельно с повторами (at-least-once, поэтому потребители идемпотентны).

  • Публикация до коммита даёт обратную проблему: событие без заказа, если транзакция откатится.
  • Promise.all не даёт атомарности, это просто параллельный запуск.
  • Таймаут не решает падение процесса между двумя операциями.

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

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