Ответ
Saga — это паттерн для управления долгоживущими бизнес-транзакциями в распределенных системах (микросервисах), где классические ACID-транзакции неприменимы. Saga разбивает транзакцию на последовательность локальных шагов, каждый из которых обновляет данные в одном сервисе и публикует событие для следующего шага. При сбое выполняются компенсирующие действия (Compensating Transactions) для отката предыдущих шагов.
Два основных стиля реализации:
-
Оркестрация (Orchestration): Центральный координатор (оркестратор) управляет потоком выполнения.
// Упрощенный пример оркестратора Saga public class OrderCreationSagaOrchestrator { public void execute(Order order) { try { inventoryService.reserveItems(order); // Шаг 1 paymentService.charge(order); // Шаг 2 shippingService.schedule(order); // Шаг 3 // Saga завершена успешно } catch (Exception e) { // Запуск компенсирующих действий paymentService.refund(order); inventoryService.releaseItems(order); // Saga завершена с ошибкой } } } -
Хореография (Choreography): Сервисы координируют работу через обмен событиями без центрального управляющего компонента.
Критически важные аспекты при реализации:
- Идемпотентность: Все шаги и компенсации должны быть идемпотентными для безопасного повтора.
- Наблюдаемость: Необходимо сквозное логирование (correlation ID) для отслеживания состояния Saga.
- Сложность отладки: Распределенный характер Saga усложняет отладку по сравнению с монолитной транзакцией.
Опыт применения: Использовал Saga с оркестрацией (на Spring State Machine) для реализации процесса оформления заказа в e-commerce, где необходимо согласованно обновить инвентарь, списать деньги и создать доставку.