В чем разница хореографии и оркестровки в реализации паттерна Saga
Что проверяют
Понимаете ли вы, что Saga заменяет распределённую транзакцию цепочкой локальных транзакций с компенсациями, и как выбрать способ координации. Следом почти всегда спрашивают, что происходит при сбое на третьем шаге и как не потерять событие.
Как отвечать
Сначала общая часть: каждый сервис коммитит свою локальную транзакцию, а если дальше что-то не удалось, запускаются компенсирующие действия в обратном порядке: снять резерв, вернуть деньги. Атомарности и изоляции как в ACID здесь нет, промежуточные состояния видны другим.
- хореография: центра нет. Сервис заказов публикует
OrderCreatedв Kafka, платёжный сервис реагирует и публикуетPaymentCompleted, склад слушает его. Связность слабая и нет единой точки отказа, но логика процесса размазана по сервисам, и понять, где застрял заказ, можно только по трассировке; - оркестровка: отдельный координатор хранит состояние саги и шлёт команды: «зарезервируй», «спиши», «отмени». Процесс описан в одном месте, его легко читать, мониторить и менять, но оркестратор становится ещё одним сервисом, который нужно масштабировать и держать доступным.
В Java-стеке оркестровку делают на Temporal, Camunda, Axon Framework или на собственном конечном автомате с состоянием в базе. Хореографию строят на Spring Kafka или Spring Cloud Stream. Ориентир для выбора: два-три шага с простыми компенсациями спокойно тянет хореография, длинный процесс с ветвлениями и таймаутами лучше отдать оркестратору.
В обоих вариантах нужны transactional outbox, чтобы запись в базу и отправка события не разъехались, и идемпотентные обработчики, потому что брокер доставляет сообщение «как минимум один раз».
Где спотыкаются
Называют сагу распределённой транзакцией с откатом. Отката нет, есть компенсация, и она бизнесовая: списанные деньги возвращаются отдельной операцией.
Считают оркестратор неизбежным узким местом. Его масштабируют как любой сервис, а реальная цена в другом: он знает про всех участников процесса.
Не продумывают шаги, которые нельзя компенсировать, например отправленное клиенту письмо. Такие шаги ставят в конец саги, после точки невозврата.