При создании заказа запишите сам заказ и событие OrderCreated в outbox в одной транзакции БД. Отдельный процесс публикует сохранённое событие в брокер и отмечает его отправку.
Приведите пример паттерна Transactional Outbox.
При создании заказа запишите сам заказ и событие OrderCreated в outbox в одной транзакции БД. Отдельный процесс публикует сохранённое событие в брокер и отмечает его отправку.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
При создании заказа запишите сам заказ и событие OrderCreated в outbox в одной транзакции БД. Отдельный процесс публикует сохранённое событие в брокер и отмечает его отправку.
Если транзакция откатывается, нет ни заказа, ни события. Если процесс падает после commit, событие остаётся в outbox и будет отправлено позже. Если он падает после публикации до отметки, возможна повторная отправка.
Поэтому событию нужен стабильный ID, а потребителю — идемпотентная обработка или inbox. Не держите транзакцию создания заказа открытой на время обращения к брокеру. Несколько отправителей должны безопасно разделять задания; порядок событий по агрегату и очистка outbox проектируются отдельно.