Выбор ответа Senior Кеш и очереди обновлено
Transactional outbox
Вопрос
Сервис сохраняет заказ в PostgreSQL и публикует событие OrderCreated в брокер. Иногда заказ есть, а события нет. Какой паттерн это решает?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Transactional outbox: событие в таблицу той же транзакцией. Запись в базу и отправка в брокер это две разные системы, атомарно их не сделать.
Варианты ответа
- Публиковать событие до коммита транзакции заказа
- Увеличить таймаут брокера и число повторов отправки
- Двухфазный коммит с брокером через
Promise.all - Transactional outbox: событие в таблицу той же транзакциейправильный ответ
Разбор
Запись в базу и отправка в брокер это две разные системы, атомарно их не сделать. Outbox сводит задачу к одной транзакции в базе, а публикация идёт отдельно с повторами (at-least-once, поэтому потребители идемпотентны).
- Публикация до коммита даёт обратную проблему: событие без заказа, если транзакция откатится.
Promise.allне даёт атомарности, это просто параллельный запуск.- Таймаут не решает падение процесса между двумя операциями.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.