Что такое сага паттерн
Что проверяют
Понимаете ли, зачем в распределённой системе отказываются от одной транзакции на всё, и готовы ли платить за этот отказ. Вопрос про сагу почти всегда про согласованность: как довести бизнес-операцию до конца, когда у каждого сервиса своя база и общего коммита не существует.
Как отвечать
Сага это бизнес-операция, разбитая на цепочку локальных транзакций. Каждый шаг коммитится в своей базе сразу, а на случай отказа у него заготовлена компенсирующая операция. Упал четвёртый шаг, значит выполняются компенсации третьего, второго и первого, в обратном порядке.
Координировать цепочку можно двумя способами. Оркестрация: координатор хранит состояние саги и рассылает сервисам команды, процесс читается в одном месте и легче отлаживается. Хореография: сервисы публикуют события и подписываются друг на друга, единой точки нет, но логика процесса растворяется по сервисам и его целиком уже нигде не видно.
В Python-сервисе главное решить, где живёт состояние: в таблице, а не в памяти воркера, иначе перезапуск процесса теряет незавершённую сагу. Событие и запись в базу связывают через outbox: коммит в PostgreSQL и публикацию в брокер атомарно не совместить, поэтому сообщение пишется в ту же транзакцию, а отдельный отправщик его разносит. Доставка идёт at-least-once, значит каждый обработчик обязан быть идемпотентным по ключу операции.
Где спотыкаются
Называют компенсацию откатом. Откатить закоммиченное нельзя: компенсация это новая бизнес-операция с собственными следами, возврат денег виден в выписке как второе движение, а не как отсутствие первого. Есть шаги, которые компенсировать нечем, например отправленное письмо, их ставят в конец цепочки.
Забывают про потерянную изоляцию. Пока сага идёт, промежуточные состояния видны всем: заказ уже создан, оплата ещё нет. Лечится это статусами и семантическими блокировками на уровне данных, а не надеждой, что в эту секунду никто не прочитает.
Не продумывают отказ самой компенсации. Компенсирующий шаг тоже падает, и без ограниченных повторов, таймаута на зависшую сагу и очереди ручного разбора система молча залипает в промежуточном состоянии, а узнают об этом от поддержки.