Ответ
Хореография — это децентрализованный паттерн взаимодействия микросервисов, при котором каждый сервис работает автономно и реагирует на события, происходящие в системе, без центрального управляющего компонента.
Это противопоставляется паттерну Оркестрации, где один сервис-оркестратор (дирижер) управляет всем бизнес-процессом, вызывая другие сервисы в определенной последовательности.
Как это работает:
Сервисы общаются через события (events), публикуя их в общую шину данных (message broker, например, RabbitMQ или Kafka). Другие сервисы подписываются на интересующие их события и реагируют на них, выполняя свою часть бизнес-логики и, возможно, публикуя новые события.
Пример сценария "Создание заказа":
Order Service
получает запрос на создание заказа и публикует событиеOrderCreated
.Payment Service
подписан наOrderCreated
, получает событие, обрабатывает платеж и публикует событиеPaymentProcessed
.Notification Service
также подписан наOrderCreated
, получает его и отправляет пользователю уведомление о создании заказа.
# Упрощенный пример с использованием псевдо-брокера
# --- Order Service ---
def create_order(order_data):
print("[Order Service] Создан заказ, публикуем событие OrderCreated")
# message_broker.publish('OrderCreated', order_data)
# --- Payment Service (слушатель) ---
def on_order_created(order_data):
print("[Payment Service] Получено событие OrderCreated. Обработка платежа...")
print("[Payment Service] Платеж обработан, публикуем событие PaymentProcessed")
# message_broker.publish('PaymentProcessed', order_data)
# --- Notification Service (слушатель) ---
def send_creation_notification(order_data):
print("[Notification Service] Получено событие OrderCreated. Отправка уведомления...")
# Симуляция процесса
new_order = {"id": 123, "user_id": 456}
# 1. Сервис заказов инициирует процесс
create_order(new_order)
# 2. Брокер доставляет событие подписчикам
on_order_created(new_order)
send_creation_notification(new_order)
Преимущества:
- Низкая связанность (Loose Coupling): Сервисы не знают о существовании друг друга.
- Гибкость и масштабируемость: Легко добавлять новые сервисы, реагирующие на существующие события.
- Повышенная отказоустойчивость: Отказ одного сервиса не останавливает всю систему.
Недостатки:
- Сложность мониторинга: Трудно отследить полный жизненный цикл бизнес-процесса, так как он распределен по многим сервисам.
- Риск циклических зависимостей между событиями.