Ответ
Transaction Outbox — это паттерн для надежной доставки событий в распределенных системах. Основная идея: сохранять исходящие события в той же транзакции, что и изменения данных, чтобы гарантировать их отправку.
Пример на Go с использованием SQL транзакции:
func CreateOrder(ctx context.Context, tx *sql.Tx, order Order) error {
// Сохраняем заказ
_, err := tx.ExecContext(ctx, "INSERT INTO orders...", order)
if err != nil {
return err
}
// Сохраняем событие в outbox в той же транзакции
event := OutboxEvent{
Type: "OrderCreated",
Payload: []byte(`{"id":123}`),
}
_, err = tx.ExecContext(ctx, "INSERT INTO outbox...", event)
return err
}
Плюсы:
- Гарантирует атомарность изменения данных и события
- Упрощает обработку ошибок
- Позволяет ретраить отправку событий
Минусы:
- Требует дополнительную таблицу в БД
- Нужен отдельный процесс для отправки событий из outbox