PRO

Что такое Saga pattern для распределённых транзакций?

Saga pattern управляет бизнес-процессом, который затрагивает несколько сервисов и их локальные базы данных, без общей распределённой транзакции. Saga состоит из последовательности локальных транзакций; при ошибке выполняются компенсирующие действия, которые логически отменяют успешно завершённые предыдущие шаги.
Подробный ответ

Проблема распределённой транзакции

В микросервисах каждый сервис обычно владеет своей БД. Одна бизнес-операция, например оформление заказа, может затронуть Order, Payment, Inventory и Delivery. Обычная ACID-транзакция не может просто охватить независимые сервисы и хранилища без дорогих и хрупких распределённых механизмов.

Как работает Saga

Create order
  |
Reserve inventory
  |
Charge payment
  |
Create shipment
  |
Complete order

If payment fails:
Cancel order
Release inventory reservation

Каждый сервис выполняет свою локальную транзакцию и публикует событие либо возвращает результат оркестратору. Если один из шагов нарушает бизнес-правило или не может быть завершён, saga запускает compensating transactions для ранее выполненных шагов.

Compensating transaction

Компенсация не всегда является техническим rollback базы. Например, после списания денег может потребоваться возврат платежа, после резервирования товара — снятие резерва, после создания заказа — его отмена. Компенсирующее действие тоже может завершиться ошибкой и требует отдельной стратегии обработки.

Choreography

При choreography сервисы реагируют на события друг друга. Например, Order публикует OrderCreated, Inventory резервирует товар и публикует InventoryReserved, затем Payment реагирует на это событие.

Orchestration

При orchestration отдельный saga orchestrator явно отправляет команды участникам и принимает решения о следующем шаге или компенсации. Такой подход делает flow более явным, но добавляет центральный компонент координации.

Что необходимо для Saga

  • идемпотентные handlers и compensations;

  • retries с backoff и dead-letter queue;

  • outbox pattern для надёжной публикации событий;

  • correlation ID и tracing всей saga;

  • явные состояния pending, completed, failed и compensated;

  • операционный процесс для зависших и вручную разбираемых saga.

Как ответить на собеседовании

Saga заменяет одну распределённую транзакцию последовательностью локальных транзакций и compensating actions. Она даёт eventual consistency между сервисами. Saga можно координировать через choreography на событиях или через orchestration. Для production нужны идемпотентность, outbox, retries, DLQ, tracing и обработка зависших процессов.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге