Перейти к содержимому
Оркестрация vs Хореография

Оркестрация vs Хореография

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

Введение: Дирижёр или джаз-банд

Представьте симфонический оркестр. Есть дирижёр, который стоит в центре и указывает, когда какой музыкант должен вступить. Дирижёр знает всю партитуру. Музыканты смотрят только на дирижёра. Если дирижёр ушёл, оркестр останавливается. Это оркестрация.

Теперь представьте джазовый ансамбль. Нет дирижёра. Музыканты слушают друг друга. Саксофон начал — барабаны подхватили, пианино добавило аккорд. Каждый знает, что делать, наблюдая за другими. Если кто-то ошибся, остальные подстраиваются. Нет единого центра. Это хореография.

В мире распределённых систем и интеграций два подхода к координации сервисов.

Оркестрация — есть центральный координатор (оркестратор), который вызывает сервисы в нужном порядке, обрабатывает ошибки, управляет транзакциями. Оркестратор знает весь процесс.

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

Для системного аналитика выбор между оркестрацией и хореографией — это выбор между контролем и гибкостью, между простотой отладки и масштабируемостью.

Оркестрация: Есть дирижёр

    sequenceDiagram
    participant O as Оркестратор
    participant A as Сервис A
    participant B as Сервис B
    participant C as Сервис C
    
    O->>A: 1. Сделай A
    A-->>O: Готово
    O->>B: 2. Сделай B
    B-->>O: Готово
    O->>C: 3. Сделай C
    C-->>O: Готово
  

Пример: Оформление заказа

    sequenceDiagram
    participant O as Оркестратор заказов
    participant P as Платежный шлюз
    participant S as Склад
    participant N as Уведомления
    
    O->>P: 1. Списать деньги
    P-->>O: Успешно
    O->>S: 2. Зарезервировать товар
    S-->>O: Успешно
    O->>N: 3. Отправить уведомление
    N-->>O: Успешно
    O-->>O: Заказ оформлен
  

Хореография: Нет дирижёра

    sequenceDiagram
    participant A as Сервис A
    participant B as Сервис B
    participant C as Сервис C
    
    A->>B: Событие "A сделано"
    B->>C: Событие "B сделано"
  

Пример: Оформление заказа (хореография)

    sequenceDiagram
    participant Web as Веб-сайт
    participant P as Платежный шлюз
    participant S as Склад
    participant N as Уведомления
    
    Web->>P: Событие "заказ создан"
    P->>S: Событие "оплачено"
    S->>N: Событие "товар зарезервирован"
  

Сравнение

ХарактеристикаОркестрацияХореография
Центральный координаторЕстьНет
Знание процессаОркестратор знает всёКаждый сервис знает свою часть
СвязанностьОркестратор знает всехСервисы знают только о событиях
Сложность процессаВ одном местеРаспределена
ОтладкаПроще (один лог)Сложнее (много логов)
МасштабированиеОркестратор — узкое местоЛегко
УстойчивостьОркестратор — единая точка отказаВысокая (нет центра)
Изменение процессаМеняем оркестратораМеняем несколько сервисов
ТранзакцииЛегче (компенсации)Сложнее (сага)
ПримерBPMN, Camunda, TemporalKafka, события

Плюсы и минусы

Оркестрация: Плюсы

ПлюсОбъяснение
Централизованная логикаВесь процесс в одном месте
Простая отладкаОдин лог, один трейс
Лёгкие компенсацииОркестратор знает, что откатить
Синхронный ответКлиент ждёт результат
КонтрольМожно реализовать сложные ветвления

Оркестрация: Минусы

МинусОбъяснение
Единая точка отказаУпал оркестратор — всё встало
Узкое местоВесь трафик через оркестратора
СвязанностьОркестратор знает всех
МасштабированиеОркестратор сложно масштабировать

Хореография: Плюсы

ПлюсОбъяснение
Слабая связанностьСервисы знают только о событиях
МасштабированиеЛегко добавить новых участников
УстойчивостьНет единой точки отказа
ГибкостьМожно добавить новый сервис без изменения старых

Хореография: Минусы

МинусОбъяснение
Сложная отладкаТрудно понять, что произошло
Распределённая логикаПроцесс “размазан” по сервисам
Сложные компенсацииТрудно откатить
Нет синхронного ответаКлиент не ждёт

Когда что выбирать

Оркестрация подходит, когда

УсловиеПочему
Процесс сложный, с ветвлениямиОркестратор может реализовать любую логику
Нужен синхронный ответКлиент ждёт результат
Важен контрольНужно чётко управлять порядком
Требуются компенсацииЛегче откатить через оркестратора
Мало участниковОркестратор не станет узким местом
Процесс меняется частоМеняем только оркестратора

Хореография подходит, когда

УсловиеПочему
Много участниковОркестратор станет узким местом
Процесс линейныйПросто цепочка событий
Высокая нагрузкаЛегко масштабировать
Нужна слабая связанностьСервисы не знают друг о друге
Асинхронность допустимаКлиенту не нужен мгновенный ответ
Процесс редко меняетсяМенять несколько сервисов не проблема

Реальный пример: Обработка заказа

Оркестрация

    graph TD
    A[Клиент] -->|заказ| B[Оркестратор заказов]
    B -->|1| C[Платежи]
    B -->|2| D[Склад]
    B -->|3| E[Уведомления]
    C -->|успех| B
    D -->|успех| B
    E -->|успех| B
    B -->|ответ| A
  

Что происходит:

  1. Клиент отправляет заказ оркестратору
  2. Оркестратор вызывает платёжный сервис (ждёт ответа)
  3. Оркестратор вызывает склад (ждёт ответа)
  4. Оркестратор вызывает уведомления (ждёт ответа)
  5. Оркестратор отвечает клиенту

Если платеж не прошёл: Оркестратор не вызывает склад, возвращает ошибку.

Хореография

    graph TD
    A[Клиент] -->|событие - заказ создан| B[Брокер]
    B -->|"заказ создан"| C[Платежи]
    C -->|событие - оплачено| B
    B -->|"оплачено"| D[Склад]
    D -->|событие - товар зарезервирован| B
    B -->|товар зарезервирован| E[Уведомления]
  

Что происходит:

  1. Клиент публикует событие “заказ создан”
  2. Платежи получают событие, списывают деньги, публикуют “оплачено”
  3. Склад получает “оплачено”, резервирует товар, публикует “товар зарезервирован”
  4. Уведомления получают “товар зарезервирован”, отправляют письмо

Если платеж не прошёл: Платежи публикуют “оплата не удалась”. Никто не реагирует (или кто-то реагирует, например, уведомления).

Компенсации (Откат)

Оркестрация

    graph TD
    A[Оркестратор] --> B[Шаг 1: оплата]
    B --> C[Шаг 2: склад]
    C -->|ошибка| D[Компенсация: отмена оплаты]
  

Оркестратор знает, что откатить.

Хореография

    graph TD
    A[Склад] -->|ошибка| B[Событие - ошибка резервирования]
    B --> C[Платежи] -->|компенсация| D[Событие - возврат денег]
  

Каждый сервис публикует компенсирующие события. Сложнее.

Гибридный подход

Часто используют комбинацию.

Пример: Внутри команды — оркестрация (микросервисы вызывают друг друга синхронно). Между командами — хореография (события через Kafka).

    graph TD
    subgraph "Команда А"
        A1[Сервис A1] --> A2[Сервис A2]
        A2 --> A3[Сервис A3]
    end
    
    subgraph "Команда Б"
        B1[Сервис Б1] --> B2[Сервис Б2]
    end
    
    A3 -->|событие| K[Kafka]
    K -->|событие| B1
  

Инструменты

ПодходИнструменты
ОркестрацияCamunda, Temporal, Zeebe, AWS Step Functions, Apache Airflow
ХореографияKafka, RabbitMQ, AWS SNS/SQS, NATS

Распространённые ошибки

Ошибка 1: Оркестратор знает слишком много деталей

Оркестратор знает не только порядок, но и внутренние детали сервисов. При изменении сервиса меняется оркестратор.

Решение: Оркестратор должен знать только внешний API сервисов.

Ошибка 2: Хореография без мониторинга

События идут, никто не знает, что происходит.

Решение: Централизованное логирование, трассировка.

Ошибка 3: Сложные компенсации в хореографии

Пытаются откатить распределённую транзакцию через события.

Решение: Проектировать систему так, чтобы компенсации были простыми, или переходить на оркестрацию.

Ошибка 4: Оркестратор как монолит

Оркестратор превращается в монолитный “супер-сервис”.

Решение: Разбивать оркестратора на несколько по доменам.

Ошибка 5: Синхронный вызов в хореографии

Пытаются получить синхронный ответ в событийной архитектуре.

Решение: Либо принимать асинхронность, либо переходить на оркестрацию.

Резюме

  1. Оркестрация — есть центральный координатор (дирижёр). Он вызывает сервисы, знает весь процесс, управляет ошибками.

  2. Хореография — нет центрального координатора. Сервисы общаются через события. Каждый знает свою роль.

  3. Ключевое различие: кто знает процесс? Оркестратор знает всё. При хореографии процесс распределён.

  4. Оркестрация: проще отладка, легче компенсации, но единая точка отказа, узкое место.

  5. Хореография: слабая связанность, масштабируемость, устойчивость, но сложная отладка и компенсации.

  6. Когда оркестрация: сложный процесс, нужен синхронный ответ, контроль.

  7. Когда хореография: много участников, высокая нагрузка, слабая связанность.

Проверка знаний

Вопрос 1 из 4
Что лучше всего описывает оркестрацию?
Что является главным признаком хореографии?
Какой подход обычно проще отлаживать?
Какой подход обычно лучше масштабируется и не имеет единой точки отказа?

Вопросы, где были ошибки