Sobes.tech
Назад к вопросам
Senior
4

Использовали ли вы паттерны Inbox и Outbox?

Компании, где спрашивали
FREEDOM LIFESTYLE

Ответ от нейросети

sobes.tech AI

Паттерны Inbox и Outbox применяются для обеспечения надёжной асинхронной интеграции между сервисами, особенно в микросервисной архитектуре.

Inbox pattern — это механизм приёма сообщений. Сервис сохраняет входящие сообщения в локальную таблицу (Inbox), проверяет их уникальность и обрабатывает, гарантируя идемпотентность.

Outbox pattern — это механизм отправки сообщений. При изменении состояния в сервисе сообщение записывается в таблицу Outbox в рамках той же транзакции, что и бизнес-операция. Затем отдельный процесс читает Outbox и отправляет сообщения в очередь или другому сервису.

Это позволяет избежать проблем с потерей сообщений и рассинхронизацией данных при сбоях.

В Go можно реализовать эти паттерны, используя транзакции базы данных и отдельные горутины для обработки Outbox.

Пример упрощённого Outbox:

func SaveOrder(ctx context.Context, order Order) error {
    tx, err := db.BeginTx(ctx, nil)
    if err != nil {
        return err
    }

    // Сохраняем заказ
    if err := saveOrderTx(tx, order); err != nil {
        tx.Rollback()
        return err
    }

    // Записываем событие в Outbox
    if err := saveOutboxEventTx(tx, order.Event); err != nil {
        tx.Rollback()
        return err
    }

    return tx.Commit()
}

Затем отдельный воркер читает Outbox и отправляет события в брокер сообщений.