Sobes.tech
Back to questions
Junior
3

Расскажи про Transactional Outbox паттерн — что это такое и зачем используется?

Companies where asked
СБК ПАРУС

Answer from AI

sobes.tech AI

Transactional Outbox — это паттерн, который помогает гарантировать атомарность записи данных и отправки сообщений в распределённых системах.

Проблема: если у вас есть операция, которая изменяет данные в базе и должна отправить событие (например, в очередь сообщений), то эти две операции — запись в базу и отправка сообщения — обычно не атомарны. Если база обновилась, а сообщение не отправилось (или наоборот), система окажется в неконсистентном состоянии.

Решение: при изменении данных в рамках транзакции записывается не только основная информация, но и специальная "outbox" таблица с событиями, которые нужно отправить. После успешного коммита транзакции отдельный процесс читает эту таблицу и отправляет сообщения в очередь. Таким образом, гарантируется, что событие не потеряется и не будет отправлено дважды.

Пример:

// В транзакции
tx.Exec("INSERT INTO orders ...")
tx.Exec("INSERT INTO outbox (event_type, payload) VALUES (?, ?)")
// После коммита отдельный воркер читает outbox и публикует события