Используйте Transactional Outbox: сущность и запись о событии сохраняются в одной транзакции БД, а отдельный процесс доставляет событие в брокер с повторами.
Как решить проблему dual write: сущность успешно сохранена в БД через API, но публикация события в брокер/Kafka завершилась ошибкой?
Используйте Transactional Outbox: сущность и запись о событии сохраняются в одной транзакции БД, а отдельный процесс доставляет событие в брокер с повторами.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Используйте Transactional Outbox: сущность и запись о событии сохраняются в одной транзакции БД, а отдельный процесс доставляет событие в брокер с повторами.
Если транзакция не зафиксирована, нет ни сущности, ни обещания отправить событие. Если брокер недоступен после commit, outbox остаётся и будет обработан позже.
Публикация и отметка «отправлено» обычно не атомарны между системами: сбой в этом промежутке может дать повтор. Поэтому событию нужен устойчивый ID, а потребителю — дедупликация или идемпотентная операция. Мониторьте возраст очереди и неуспешные доставки. Отдельный HTTP-ответ клиенту должен отражать сохранение сущности, не создавать ложную гарантию уже завершённой обработки всеми потребителями.