Вопрос проверяет, знаете ли вы, как надёжно синхронизировать изменения в БД и публикацию событий.
Transactional outbox — это паттерн, при котором бизнес-данные и событие записываются в одну транзакцию базы данных. Событие сохраняется в специальную outbox-таблицу. Отдельный процесс позже читает эту таблицу и публикует события в брокер. Это устраняет проблему “данные сохранились, а событие не ушло” или наоборот. Паттерн часто используют в микросервисах с асинхронным взаимодействием.
Transactional outbox — архитектурный паттерн, гарантирующий, что изменения в базе данных и соответствующие события будут зафиксированы атомарно.
Без outbox возможна ситуация:
Транзакция в БД закоммитилась.
Отправка события в брокер упала.
Другие сервисы никогда не узнают об изменении.
Или наоборот — событие отправлено, а данные не сохранены.
В рамках одной транзакции:
обновляются бизнес-таблицы;
вставляется запись в outbox-таблицу.
После коммита:
отдельный worker читает outbox;
публикует события в брокер;
помечает записи как обработанные.
with db.transaction():
save_order(order)
save_outbox_event(
type="OrderCreated",
payload={"order_id": order.id}
)
Надёжные транзакции.
Простая реализация outbox-таблицы.
Возможность блокировок, batch-чтения, индексов.
Хорошо сочетается с CDC и logical replication.
Нужно чистить outbox-таблицу.
Публикация событий происходит не мгновенно.
Worker должен быть устойчив к повторам.
Transactional outbox — базовый паттерн для надёжной интеграции БД и событий, когда нельзя позволить себе рассинхронизацию данных и сообщений.