Что такое саги в микросервисах
Что проверяют
Знаете ли, что между сервисами нет общей транзакции, и владеете ли принятой терминологией. Для Node это ещё и вопрос про работу с брокером: повторы, порядок сообщений, идемпотентность обработчиков.
Как отвечать
Сага это способ довести многосервисную операцию до конца без распределённой транзакции. Операция режется на локальные транзакции, каждая коммитится в своей базе, на каждую заготовлена компенсация. Отказ на середине означает не откат, а выполнение компенсаций уже пройденных шагов.
Схем координации две, и названия важны. Оркестрация это командная схема: центральный координатор хранит состояние процесса и вызывает сервисы по очереди. Хореография это событийная схема: сервис завершает свой шаг, публикует событие, подписчики продолжают цепочку. Оркестрация проще в отладке и даёт видимый статус процесса, хореография меньше связывает сервисы, но сквозной сценарий приходится собирать по логам.
Практика на Node: состояние саги в базе, а не в памяти процесса; таблица с шагом, статусом и числом попыток; outbox, чтобы запись и публикация события не расходились; идемпотентность по идентификатору сообщения, потому что брокеры дают at-least-once; таймаут на каждый шаг и dead letter для разбора; ключ партиционирования в Kafka по идентификатору заказа, иначе события одной саги обработаются вразнобой.
Где спотыкаются
Путают названия схем и объявляют хореографию командным подходом, а оркестрацию событийным. Интервьюер обычно ловит именно это, потому что перепутанные термины означают, что человек читал пересказ, а не строил такой процесс.
Держат сагу в памяти: цепочка await внутри одного обработчика, состояние в замыкании. Под перезапустился на середине, и незавершённых операций уже никто не найдёт. Последовательные вызовы сервисов транзакцией не становятся, сколько их ни оборачивай в try/catch.
Публикуют событие сразу после успешного ответа базы, без outbox. Падение между коммитом и отправкой оставляет данные записанными, а остальную цепочку не запущенной; обратный порядок даёт события про то, чего в базе нет. Расхождение всплывает редко и разбирается тяжело.