Перейти к содержимому
5 / 15

Как гарантировать, что событие не потеряется при коммите в базу — что такое transactional outbox?

Проблема двойной записи: коммит в базу и публикация в брокер — две разные системы, общей транзакции у них нет. Упали между ними — либо заказ есть, а события нет, либо наоборот. Outbox убирает вторую систему из критического пути: событие пишется строкой в таблицу outbox той же транзакцией, что и бизнес-данные, поэтому либо есть и то и другое, либо ничего. Отдельный процесс-relay читает неопубликованные строки, пропуская заблокированные соседним экземпляром, публикует их в брокер и помечает отправленными. Гарантия получается at-least-once: relay может успеть отправить и не успеть отметить, поэтому потребитель обязан быть идемпотентным. Альтернатива без своего relay — CDC: Debezium читает журнал транзакций и публикует изменения сам.

Как гарантировать, что событие не потеряется при коммите в базу — что такое transactional outbox? | JScriptiser