Какие знаешь способы координации транзакций в Saga

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

Ответ

В Golang координацию транзакций в Saga можно реализовать несколькими способами:

  1. Choreography (Оркестровка без центрального координатора):

    • Сервисы общаются через события (Kafka, RabbitMQ)
    • Каждый сервис знает свою часть компенсации
    // Пример обработки события
    func HandleOrderCreated(event Event) {
        if err := ProcessPayment(); err != nil {
            Publish(PaymentFailedEvent{...})
        } else {
            Publish(PaymentSucceededEvent{...})
        }
    }
  1. Orchestration (С центральным координатором):

    • Отдельный сервис управляет потоком выполнения
    • Хранит состояние саги и вызывает компенсации
    type SagaOrchestrator struct {
        steps []SagaStep
    }

    func (s *SagaOrchestrator) Execute() {
        for _, step := range s.steps {
            if err := step.Execute(); err != nil {
                s.Compensate()
                break
            }
        }
    }
  1. Хранение состояния:

    • В БД или Redis для восстановления после сбоев
    • Важно обеспечить идемпотентность операций
  2. Таймауты:

    • Контроль времени выполнения каждого шага
    • Автоматическая компенсация при превышении

Для надежности стоит комбинировать несколько подходов, особенно в распределенных системах.