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.
Бесплатный онлайн-инструмент — проверка HTTP-заголовков: результат мгновенно, без регистрации.
Saga: PlaceOrder
1. ReserveInventory → compensation: ReleaseInventory
2. ChargePayment → compensation: RefundPayment
3. ShipOrder → compensation: CancelShipment
On failure at step 3 → run compensations 2, 1 in reverseSaga pattern — это архитектурный шаблон, который позволяет управлять распределёнными транзакциями в микросервисной архитектуре. Он обеспечивает согласованность данных без необходимости блокировать ресурсы, что особенно важно в распределённых системах. Saga состоит из последовательности локальных транзакций, каждая из которых выполняет определённое действие и, при необходимости, может быть отменена с помощью компенсационных транзакций.
Основная идея 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 может значительно улучшить управление распределёнными транзакциями, но требует тщательного планирования и понимания его особенностей.
2PC (XA transactions) — synchronous, locks ресурсы, не масштабируется, редко в cloud. Saga — async, eventual consistency, no locks.
Choreography для 2-3 services. Orchestration для complex flows (5+ steps) — легче debug и modify.
Temporal (temporal.io) — modern, durable execution. Netflix Conductor. AWS Step Functions. For simpler — just messages via Kafka/RabbitMQ.
Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.