Реализовывали ли паттерн саги для консистентности в микросервисах
Что проверяют
Работали ли вы с распределёнными транзакциями руками или знаете паттерн по картинке. Признак реального опыта это разговор про компенсации, идемпотентность и надёжную публикацию событий, а не пересказ различий между оркестрацией и хореографией.
Как отвечать
Опишите суть. Длинная бизнес-операция разбивается на локальные транзакции в разных сервисах, у каждого шага есть компенсирующее действие, и при сбое компенсации выполняются для уже завершённых шагов в обратном порядке. Это не откат: компенсация семантическая, отменённый платёж остаётся в истории как возврат.
Дальше про координацию. Хореография это события в брокере и отсутствие центра: просто на трёх шагах, нечитаемо на семи. Оркестрация это явная машина состояний, координатор хранит прогресс саги в своей базе и умеет продолжить её после перезапуска. В Java это обычно либо свой сервис состояний поверх @Transactional шагов, либо готовый движок процессов.
Назовите то, без чего сага не живёт в проде:
- идемпотентность: каждый шаг и каждая компенсация выдерживают повтор, ключ идемпотентности едет вместе с сообщением;
- transactional outbox: запись в базу и постановка события в очередь происходят в одной локальной транзакции, иначе теряются либо данные, либо событие;
- порядок шагов: некомпенсируемые действия, например отправка письма, ставятся последними;
- семантическая блокировка: промежуточный статус защищает сущность от параллельных изменений, потому что изоляции у саги нет.
Где спотыкаются
Говорят, что сага заменяет двухфазный коммит и даёт те же гарантии. Она даёт согласованность в конечном счёте, а не атомарность: промежуточные состояния видны наружу, и пользователь успевает увидеть заказ, который через секунду отменится.
Второе: забывают, что компенсация тоже падает. Нужны повторы, ограничение попыток, очередь недоставленных сообщений и место, где застрявшую сагу увидит человек, иначе система тихо копит незавершённые процессы.
Третье: считают дублирование сообщений редким случаем. Брокеры дают доставку хотя бы один раз, поэтому повтор это норма, и если обработчик не идемпотентен, товар зарезервируется дважды.