Что такое паттерн Saga и в чем разница между хореографией и оркестрацией?

Ответ

Saga — это паттерн управления распределёнными транзакциями в микросервисной архитектуре. Он позволяет поддерживать целостность данных между несколькими сервисами без использования двухфазного коммита (2PC), который плохо масштабируется.

Существует два основных подхода к реализации Saga:

1. Хореография (Choreography)

Это децентрализованный подход, где каждый сервис после выполнения своей локальной транзакции публикует событие в общую шину (например, Kafka или RabbitMQ). Другие сервисы подписываются на эти события и реагируют на них, запуская свои локальные транзакции. Центрального координатора нет.

  • Плюсы:
    • Слабая связанность сервисов (loose coupling).
    • Высокая масштабируемость и отказоустойчивость (нет единой точки отказа).
  • Минусы:
    • Сложно отслеживать и отлаживать бизнес-процесс, так как логика размазана по многим сервисам.
    • Риск циклических зависимостей между сервисами.

Пример на Go (псевдокод):

// Order Service: создает заказ и публикует событие
func (s *OrderService) CreateOrder(ctx context.Context, orderData Order) error {
    // ... логика создания заказа в локальной транзакции ...
    event := OrderCreatedEvent{OrderID: order.ID, UserID: order.UserID, Total: order.Total}
    return s.eventBus.Publish(ctx, "orders.created", event)
}

// Payment Service: слушает событие и обрабатывает оплату
func (s *PaymentService) HandleOrderCreated(ctx context.Context, event OrderCreatedEvent) error {
    // ... логика списания средств в локальной транзакции ...
    paymentEvent := PaymentProcessedEvent{OrderID: event.OrderID}
    return s.eventBus.Publish(ctx, "payments.processed", paymentEvent)
}

2. Оркестрация (Orchestration)

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

  • Плюсы:
    • Бизнес-логика централизована и понятна.
    • Проще отлаживать и управлять процессом.
  • Минусы:
    • Оркестратор становится единой точкой отказа.
    • Более сильная связанность сервисов с оркестратором.