1. Transactional Outbox — паттерн для надёжной отправки сообщений без распределённой транзакции между БД и брокером. Outbox — это таблица в БД, куда сообщение сохраняется в той же транзакции, что и основные данные.
2. Сообщение не теряется — если приложение падает после коммита, но до отправки, сообщение останется в таблице и будет отправлено позже.
3. Message Relay — компонент, который забирает сообщения из outbox и отправляет их в брокер. Это может быть обычный воркер, который периодически проверяет таблицу, или CDC, например Debezium.
4. Сообщение хранится в outbox до успешной отправки — после отправки оно помечается как обработанное или удаляется. Если отправить сообщение не удалось, попытка повторяется позже.
5. Transactional Outbox обычно обеспечивает at-least-once delivery — сообщение может быть доставлено повторно, поэтому получатель должен быть идемпотентным. Для дедупликации сообщений обычно используется их уникальный идентификатор.
6. Transactional Outbox сам по себе не гарантирует порядок сообщений — если порядок важен, например для одного агрегата, его нужно обеспечивать отдельно.
7. Outbox требует мониторинга и очистки — нужно следить как минимум за количеством неотправленных сообщений и возрастом самого старого сообщения, а также периодически удалять старые обработанные записи.