Что такое паттерн Saga и когда его используют
Что проверяют
Понимаете ли вы, зачем он нужен вместо распределённой транзакции, и знаете ли про компенсации.
Как отвечать
Сага решает задачу согласованности данных в операции, затрагивающей несколько сервисов со своими базами, где обычная транзакция невозможна.
Идея: операция разбивается на цепочку локальных транзакций, каждая из которых атомарна внутри своего сервиса. Для каждого шага заранее описано компенсирующее действие, отменяющее его последствия. Если шаг сбоит, ранее выполненные шаги компенсируются в обратном порядке.
Пример с заказом: создать заказ, списать деньги, зарезервировать товар, назначить доставку. Не хватило товара на третьем шаге, значит возвращаем деньги и отменяем заказ.
Два способа координации:
- хореография: сервисы реагируют на события друг друга, центра нет. Просто на трёх шагах, но при разрастании никто не видит сценарий целиком, и отладка становится мучением;
- оркестрация: отдельный координатор хранит состояние саги и рассылает команды. Сценарий виден в одном месте как явный автомат, легче отлаживать и добавлять шаги, но координатор надо писать и поддерживать.
Что обязательно назвать про ограничения:
- согласованность только в конечном счёте. Между шагами система в промежуточном состоянии, и это состояние видно пользователю;
- изоляции нет. Другой процесс может прочитать промежуточные данные. Лечится статусами («в обработке»), семантическими блокировками, коммутативными операциями;
- компенсация не откат: деньги возвращаются новой операцией, а письмо «заказ принят» уже ушло. Часть действий не компенсируется в принципе, и их выносят в конец цепочки;
- всё должно быть идемпотентным, включая компенсации, потому что доставка сообщений даёт повторы;
- в паре с сагой почти всегда идёт транзакционный ящик исходящих, иначе запись в базу и отправка события расходятся.
Где спотыкаются
Считают сагу заменой транзакции с теми же гарантиями.
Забывают, что компенсация тоже может упасть.
Строят хореографию на десяти сервисах и теряют управляемость.
Не делают шаги идемпотентными и получают двойное списание.