Saga — паттерн для управления распределёнными транзакциями. Вместо одной большой транзакции разбиваешь на цепочку локальных транзакций, каждая с компенсирующим действием на случай отката.
1. Order Service: создать заказ
compensate: отменить заказ
2. Payment Service: списать деньги
compensate: вернуть деньги
3. Inventory Service: зарезервировать товар
compensate: снять резерв
Если шаг 3 провалился — выполняются компенсации в обратном порядке: вернуть деньги → отменить заказ.
Два подхода: choreography (каждый сервис слушает события и решает сам) и orchestration (есть координатор, который управляет шагами). Orchestration проще дебажить и понимать.
В Go оркестратор часто реализуют как state machine с переходами. Ключевые требования: компенсации должны быть идемпотентными, каждый шаг записывается в лог для восстановления. Saga не даёт ACID-изоляцию — между шагами данные видны другим.