Ответ
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)
Это централизованный подход, где один сервис — оркестратор — управляет всем процессом. Он отправляет команды другим сервисам и ждет от них ответа. Оркестратор знает всю последовательность шагов и отвечает за выполнение компенсирующих транзакций в случае сбоя.
- Плюсы:
- Бизнес-логика централизована и понятна.
- Проще отлаживать и управлять процессом.
- Минусы:
- Оркестратор становится единой точкой отказа.
- Более сильная связанность сервисов с оркестратором.