Выбор ответа Senior Микросервисы и Spring Cloud обновлено
Transactional outbox
Вопрос
Сервис сохраняет заказ в БД и публикует событие OrderCreated в Kafka. Как гарантировать, что событие будет опубликовано тогда и только тогда, когда заказ сохранён?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Писать событие в outbox в той же транзакции, что и заказ. Запись в БД и отправка в брокер это две разные системы, общей транзакции у них нет.
Варианты ответа
- Отправить событие в Kafka внутри @Transactional до коммита
- Отправить событие сразу после коммита в той же функции
- Отправлять событие в отдельной транзакции REQUIRES_NEW
- Писать событие в outbox в той же транзакции, что и заказправильный ответ
Разбор
Запись в БД и отправка в брокер это две разные системы, общей транзакции у них нет. Отправка до коммита даст событие о несохранённом заказе при откате, после коммита событие потеряется при падении процесса. Outbox сводит задачу к одной локальной транзакции, а публикация из outbox идёт с повторами (поллером или CDC через Debezium), потребители при этом идемпотентны.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.