Ответ
Паттерн 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
}
Плюсы:
- Отказоустойчивость
- Подходит для микросервисов
Минусы:
- Сложность отладки
- Нужно явно прописывать компенсации