Шаг 0: Понимание сути. Saga — это последовательность локальных транзакций, где каждая следующая транзакция запускается после успешного завершения предыдущей. Если на каком-то шаге происходит сбой, запускается серия компенсирующих транзакций (компенсаций), которые откатывают изменения предыдущих шагов в обратном порядке. Важно: компенсация — это не «rollback» в классическом смысле БД. Это бизнес-операция, логически отменяющая эффект предыдущего шага (например, «отменить бронь», «вернуть деньги на счет»).
Шаг 1: Выбор координации (Choreography vs Orchestration). В 2027 году Orchestration с использованием отдельного координатора (Saga Orchestrator) стал доминирующим подходом благодаря появлению мощных, но легковесных движков (как Temporal.io или Camunda Cloud). Он проще для понимания, отладки и управления потоком. Шаги:
- Определите сервис-оркестратор. Это stateful сервис или workflow-движок, который хранит состояние саги и дирижирует ее выполнением.
- Оркестратор отправляет команды участникам (сервисам) через асинхронные сообщения (обычно через брокер вроде Apache Kafka или RabbitMQ) или gRPC-вызовы.
- Каждый участник выполняет свою локальную транзакцию и отправляет событие об успехе или неудаче обратно оркестратору.
- Оркестратор, получив событие, принимает решение: отправить команду следующему участнику или запустить компенсации.
Шаг 3: Реализация отказоустойчивости. Современные инструменты вроде Temporal берут на себя массу проблем: персистентность состояния, таймауты, повторные попытки (retries с экспоненциальной задержкой), dead-letter queues. Ваша задача — описать workflow саги на высокоуровневом языке (например, в виде кода на Go/Java/Python, который выглядит как последовательный код). Движок гарантирует его выполнение даже при падении воркеров. Вам не нужно писать логику восстановления состояния вручную.
Шаг 4: Внедрение стратегий повторных попыток и circuit breakers. Не каждый сбой требует немедленной компенсации. Сбой сети или временная недоступность сервиса должна приводить к повторным попыткам с задержкой. Используйте паттерн Circuit Breaker для участников, которые начали постоянно фейлиться, чтобы не забивать очереди и быстро переходить к компенсации всей саги. Это предотвращает каскадные сбои.
Шаг 5: Мониторинг и observability. Сага — это распределенный бизнес-процесс. Вы должны видеть его полный жизненный цикл. Интегрируйте оркестратор с системами трассировки (OpenTelemetry), чтобы каждая сага и ее шаги имели сквозной идентификатор (trace ID). Логируйте все события (старт, выполнение шага, компенсация, завершение) в структурированном виде. Создайте дашборд, где можно отслеживать количество запущенных, успешных и отмененных саг, а также среднее время выполнения.
Шаг 6: Тестирование. Тестируйте не только happy path. Обязательно создавайте сценарии:
- Падение сервиса-участника в середине выполнения.
- Таймаут при ожидании ответа от участника.
- Получение дублирующегося сообщения о завершении шага.
- Одновременный запуск двух конфликтующих саг (например, на последний билет на самолет). Для этого могут потребоваться блокировки на уровне предметной области (optimistic/pessimistic locking).
Комментарии (7)