Что такое Transaction Outbox

«Что такое Transaction Outbox» — вопрос из категории Архитектура, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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