Outbox решает разрыв между commit бизнес-данных в БД и публикацией события: оба намерения сохраняются одной локальной транзакцией. Поздний commit Kafka offset решает другую часть задачи и не закрывает этот разрыв.
Почему именно Transactional Outbox — ведь можно было сделать иначе, например коммитить в Kafka только после успешной отправки?
Outbox решает разрыв между commit бизнес-данных в БД и публикацией события: оба намерения сохраняются одной локальной транзакцией. Поздний commit Kafka offset решает другую часть задачи и не закрывает этот разрыв.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Outbox решает разрыв между commit бизнес-данных в БД и публикацией события: оба намерения сохраняются одной локальной транзакцией. Поздний commit Kafka offset решает другую часть задачи и не закрывает этот разрыв.
Если сначала изменить БД, а потом отправить сообщение, процесс может упасть между действиями; при обратном порядке возможно событие без сохранённого изменения. Worker читает outbox, повторяет отправку и отмечает результат. Дубли всё ещё возможны, поэтому получателю нужна идемпотентность. Если БД вообще не участвует и обработка целиком Kafka-to-Kafka, Kafka transactions могут быть подходящим другим решением.