Ответ
Проще в реализации, особенно для систем с небольшим количеством участников, является Saga на основе хореографии (Choreography-based Saga). Однако выбор зависит от конкретных требований к системе.
1. Хореография (Choreography)
Каждый сервис после выполнения своей части локальной транзакции публикует событие в общую шину (например, Kafka или RabbitMQ). Другие сервисы подписываются на эти события и реагируют на них, запуская свои локальные транзакции.
Простота реализации:
- Нет центрального координирующего компонента, что упрощает первоначальную настройку.
- Сервисы слабее связаны друг с другом (low coupling).
Пример:
- Сервис Заказов создает заказ и публикует событие
OrderCreated
. - Сервис Оплаты слушает
OrderCreated
, обрабатывает платеж и публикуетPaymentProcessed
. - Сервис Доставки слушает
PaymentProcessed
и начинает доставку.
Если на каком-то этапе происходит сбой (например, оплата не прошла), сервис публикует компенсирующее событие (PaymentFailed
), на которое реагируют предыдущие сервисы для отката своих транзакций.
Когда выбирать:
- В простых процессах с 2-4 участниками.
- Когда важна максимальная независимость и слабая связность сервисов.
Минусы:
- Сложно отслеживать и отлаживать весь бизнес-процесс, так как логика распределена по многим сервисам.
- Существует риск возникновения циклических зависимостей между событиями.
2. Оркестрация (Orchestration)
Существует центральный сервис-оркестратор, который управляет всем процессом. Он отправляет команды каждому участнику саги и ожидает ответа. Оркестратор хранит состояние всего процесса и решает, какой шаг выполнять следующим или как выполнить компенсацию.
Сложность реализации:
- Требуется разработка и поддержка отдельного сервиса-оркестратора.
- Оркестратор может стать единой точкой отказа (Single Point of Failure).
Когда выбирать:
- В сложных бизнес-процессах с большим количеством участников.
- Когда важна прозрачность, централизованный мониторинг и отладка процесса.
- Когда логика процесса может часто меняться.
Инструменты: Для реализации часто используют готовые фреймворки, такие как Temporal, Cadence или Camunda.
Сравнительная таблица
Критерий | Хореография (Choreography) | Оркестрация (Orchestration) |
---|---|---|
Сложность | Низкая (для простых саг) | Высокая (требует оркестратор) |
Связность | Слабая (Loose Coupling) | Сильная (с оркестратором) |
Отладка | Сложная (логика распределена) | Простая (логика централизована) |
Гибкость | Легко добавить новый сервис | Сложно, т.к. нужно менять оркестратор |
Надежность | Нет единой точки отказа | Оркестратор — единая точка отказа |