Ответ
Плюсы:
- Управляет распределенными транзакциями в микросервисной архитектуре, заменяя ACID.
- Разделяет транзакцию на этапы (компенсирующие действия), что повышает отказоустойчивость.
- Не требует глобальной блокировки ресурсов, улучшая масштабируемость.
Минусы:
- Сложность реализации: нужно предусмотреть компенсацию для каждого этапа.
- Не гарантирует строгую согласованность данных (eventual consistency).
- Отладка и мониторинг распределенных саг могут быть нетривиальными.
Пример (Golang):
func placeOrderSaga() error {
if err := reserveInventory(); err != nil {
return err
}
if err := chargeCustomer(); err != nil {
compensateInventory() // компенсация
return err
}
return nil
}