Что такое саги в микросервисной архитектуре
Что проверяют
Понимаете ли границы транзакции в микросервисной системе. Java-разработчик ежедневно пишет @Transactional, и вопрос проверяет, осознаёт ли он, что эта аннотация кончается ровно на своём источнике данных.
Как отвечать
Бизнес-операция режется на локальные транзакции по сервисам. Каждая коммитится сама, на каждую есть компенсирующее действие; при отказе на середине выполняются компенсации пройденных шагов, а не откат. Итог: согласованность итоговая, а не мгновенная.
Координация бывает через оркестрацию (координатор хранит состояние саги и шлёт команды) и через хореографию (сервисы обмениваются событиями). Альтернатива в виде распределённой транзакции существует, XA и JTA никуда не делись, но двухфазный коммит держит блокировки на время всей операции и плохо переживает падение координатора, поэтому в микросервисах от него отходят.
Чем это делают на Java: состояние саги в таблице или в движке процессов; Kafka как транспорт; transactional outbox, который заполняется в той же транзакции, что и доменные данные, и вычитывается отправщиком или CDC-механизмом; идемпотентность обработчика через таблицу обработанных сообщений; ограниченные повторы и dead letter topic. Готовые каркасы для саг и процессов брать уместно, но объяснять поведение при отказе всё равно придётся самому.
Где спотыкаются
Считают, что @Transactional или XA решают задачу между сервисами. Первая работает только со своим источником данных, вторая требует поддержки от всех участников, включая брокер, и оплачивается блокировками и хрупкостью координатора.
Описывают только успешный путь. На вопрос, что будет, если шаг ответил таймаутом и неизвестно, выполнился он или нет, ответа нет. А это основной случай: нужны идемпотентные вызовы, статус шага в базе и отдельная проверка результата, а не повтор вслепую.
Вешают компенсацию на catch в коде оркестратора. Процесс упал между шагами, и компенсация не выполнится никогда, потому что жила только в стеке вызова. Компенсации запускает то, что читает персистентное состояние, иначе их как будто нет.