Выбор ответа Senior Микросервисы и Spring Cloud обновлено

Transactional outbox

Вопрос

Сервис сохраняет заказ в БД и публикует событие OrderCreated в Kafka. Как гарантировать, что событие будет опубликовано тогда и только тогда, когда заказ сохранён?

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

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

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

Коротко

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

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

  1. Отправить событие в Kafka внутри @Transactional до коммита
  2. Отправить событие сразу после коммита в той же функции
  3. Отправлять событие в отдельной транзакции REQUIRES_NEW
  4. Писать событие в outbox в той же транзакции, что и заказправильный ответ

Разбор

Запись в БД и отправка в брокер это две разные системы, общей транзакции у них нет. Отправка до коммита даст событие о несохранённом заказе при откате, после коммита событие потеряется при падении процесса. Outbox сводит задачу к одной локальной транзакции, а публикация из outbox идёт с повторами (поллером или CDC через Debezium), потребители при этом идемпотентны.

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

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

Термины по теме