Для чего применяется паттерн Saga в микросервисной архитектуре?

«Для чего применяется паттерн Saga в микросервисной архитектуре?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерн 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): Сервисы общаются через события без центрального координатора.

Применение: Длинные бизнес-процессы (оформление заказа, бронирование поездки).