Ответ
Паттерн Saga управляет распределенными транзакциями в микросервисной архитектуре, где использование единой ACID-транзакции невозможно. Он разбивает бизнес-транзакцию на последовательность локальных транзакций в разных сервисах. В случае сбоя на любом шаге Saga запускает компенсирующие транзакции для отката предыдущих изменений, обеспечивая согласованность в конечном счете (eventual consistency).
Пример (Оркестрируемая Saga):
// Сервис-оркестратор управляет потоком
public class OrderSagaOrchestrator {
public void createOrder(OrderData data) {
try {
inventoryService.reserveItems(data); // Шаг 1
paymentService.chargeCustomer(data); // Шаг 2
shippingService.scheduleDelivery(data); // Шаг 3
} catch (Exception e) {
// Запуск компенсаций в обратном порядке
paymentService.refundPayment(data); // Компенсация шага 2
inventoryService.releaseItems(data); // Компенсация шага 1
throw new SagaFailedException(e);
}
}
}
Ключевые концепции:
- Локальные транзакции: Каждый сервис обновляет свои данные и публикует событие.
- Компенсирующие транзакции: Семантически обратные операции для отката (например,
refundдляcharge). - Стили реализации:
- Оркестрируемый (Orchestration): Центральный координатор управляет потоком.
- Хореографический (Choreography): Сервисы общаются через события без центрального координатора.
Применение: Длинные бизнес-процессы (оформление заказа, бронирование поездки).