Расскажи про опыт использования паттерна Saga

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

Ответ

Паттерн Saga помогает управлять распределёнными транзакциями в микросервисной архитектуре, разбивая их на цепочку локальных транзакций с компенсирующими действиями при ошибках.

Пример с кодом:

type OrderSaga struct {
    steps []func() error
    compensations []func() error
}

func (s *OrderSaga) AddStep(step, compensation func() error) {
    s.steps = append(s.steps, step)
    s.compensations = append(s.compensations, compensation)
}

func (s *OrderSaga) Execute() error {
    for i, step := range s.steps {
        if err := step(); err != nil {
            for j := i; j >= 0; j-- {
                s.compensations[j]() // откатываем выполненные шаги
            }
            return err
        }
    }
    return nil
}

Плюсы:

  • Отказоустойчивость
  • Подходит для микросервисов

Минусы:

  • Сложность отладки
  • Нужно явно прописывать компенсации