Skip to content
EN

Saga pattern

Коротко:

Saga pattern — способ обеспечить consistency в distributed transactions без 2PC (two-phase commit). Разбивает транзакцию на локальные steps + compensation actions (отмена step'а, если следующий failed). Два стиля: choreography (events между сервисами) и orchestration (central coordinator). Popular в microservices при purchase flows: order → payment → shipping → confirm, rollback on any failure.

Ниже: подробности, пример, смежные термины, FAQ.

Проверить свой сайт →

Подробности

  • Choreography: services listen to events, react. Loose coupling, harder to debug
  • Orchestration: saga orchestrator manages flow (Netflix Conductor, Temporal, AWS Step Functions)
  • Compensation: каждый step имеет inverse. Payment → RefundPayment
  • Idempotency: steps должны быть idempotent на retry
  • Failure modes: partial completion, retry storms

Пример

Saga: PlaceOrder
1. ReserveInventory      → compensation: ReleaseInventory
2. ChargePayment         → compensation: RefundPayment
3. ShipOrder             → compensation: CancelShipment
On failure at step 3 → run compensations 2, 1 in reverse

Смежные термины

Что такое Saga pattern?

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

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

Основная идея Saga заключается в том, что каждая транзакция выполняется независимо, и в случае сбоя последующие транзакции могут быть отменены. Существует два основных подхода к реализации Saga: ориентированный на события и ориентированный на команду.

Ориентированный на события

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

Ориентированный на команду

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

Пример реализации

Рассмотрим пример реализации Saga pattern с использованием Spring Boot и Kafka. Допустим, у нас есть два микросервиса: Order Service и Payment Service.

public class OrderSaga {
@Autowired
private KafkaTemplate<String, OrderEvent> kafkaTemplate;

public void createOrder(Order order) {
// Локальная транзакция для создания заказа
orderRepository.save(order);
// Отправка события в Kafka
kafkaTemplate.send("order.created", order);
}
}

В этом примере после успешного создания заказа отправляется событие order.created в Kafka, которое обрабатывается Payment Service.

Преимущества и недостатки Saga pattern

Saga pattern имеет множество преимуществ для управления распределёнными транзакциями, но также и недостатки, которые стоит учитывать при проектировании системы.

Преимущества

  • Устойчивость к сбоям: Каждая транзакция может быть выполнена независимо, что снижает риски и улучшает устойчивость системы.
  • Гибкость: Локальные транзакции могут быть изменены или заменены без значительного влияния на остальную архитектуру.
  • Отсутствие блокировок: Saga не требует блокировать ресурсы, что улучшает производительность и масштабируемость.

Недостатки

  • Сложность реализации: Управление состоянием и компенсационными транзакциями может быть сложным и требовать дополнительных усилий.
  • Проблемы с согласованностью: В случае ошибок может потребоваться ручное вмешательство для восстановления состояния системы.
  • Отладка: Отслеживание и отладка распределённых транзакций может быть сложной задачей из-за их асинхронной природы.

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

Больше по теме

Часто задаваемые вопросы

Saga vs 2PC?

2PC (XA transactions) — synchronous, locks ресурсы, не масштабируется, редко в cloud. Saga — async, eventual consistency, no locks.

Choreography или orchestration?

Choreography для 2-3 services. Orchestration для complex flows (5+ steps) — легче debug и modify.

Tool recommendations?

Temporal (temporal.io) — modern, durable execution. Netflix Conductor. AWS Step Functions. For simpler — just messages via Kafka/RabbitMQ.

Запустить инструмент, который описан в этой статье

Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.