Расскажи про Transactional Outbox паттерн — что это такое и зачем используется?
Answer from AI
sobes.tech AI
Transactional Outbox — это паттерн, который помогает гарантировать атомарность записи данных и отправки сообщений в распределённых системах.
Проблема: если у вас есть операция, которая изменяет данные в базе и должна отправить событие (например, в очередь сообщений), то эти две операции — запись в базу и отправка сообщения — обычно не атомарны. Если база обновилась, а сообщение не отправилось (или наоборот), система окажется в неконсистентном состоянии.
Решение: при изменении данных в рамках транзакции записывается не только основная информация, но и специальная "outbox" таблица с событиями, которые нужно отправить. После успешного коммита транзакции отдельный процесс читает эту таблицу и отправляет сообщения в очередь. Таким образом, гарантируется, что событие не потеряется и не будет отправлено дважды.
Пример:
// В транзакции
tx.Exec("INSERT INTO orders ...")
tx.Exec("INSERT INTO outbox (event_type, payload) VALUES (?, ?)")
// После коммита отдельный воркер читает outbox и публикует события