JavaRush /Курсы /Модуль 5. Spring /Лекция 213: Координация саг: Оркестрация и Хореография

Лекция 213: Координация саг: Оркестрация и Хореография

Модуль 5. Spring
22 уровень , 2 лекция
Открыта

Если представить распределённую систему как большой музыкальный оркестр, то у нас есть два подхода к управлению её исполнением: оркестрация и хореография.

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

Различия между оркестрацией и хореографией

Аспект Оркестрация Хореография
Подход Централизованное управление Децентрализованное взаимодействие
Координатор Есть главный координатор Нет главного координатора
Гибкость Менее гибкая, требуются изменения в дирижёре Высокая гибкость, можно легко добавлять новые события
Простота отладки Легче отлаживать, изменения централизованы Сложнее отлаживать из-за децентрализованности
Примеры BPMN, Camunda Kafka, RabbitMQ

Оркестрация Saga

В случае оркестрации есть один центральный компонент, который управляет всеми шагами саги. Это своего рода "координатор саги". Он знает, какие действия нужно совершить, в какой последовательности, и что делать, если что-то идёт не так.

Например, если вы хотите реализовать процесс оформления заказа, координатор будет управлять:

  1. Созданием заказа.
  2. Резервированием товаров на складе.
  3. Выставлением счета клиенту.

Если на одном из этих шагов что-то пойдёт не так, координатор скажет: "Окей, отменяем заказ".

Преимущества оркестрации

  1. Простота управления: все шаги управляются централизованно, что облегчает понимание общего процесса.
  2. Легче отлаживать: логи координатора помогут вам отследить, где произошла ошибка.
  3. Подходит для сложных процессов: удобно, когда у вас сложный процесс с большим количеством шагов.

Недостатки оркестрации

  1. Централизованная точка отказа: если координатор выходит из строя, процесс останавливается.
  2. Меньшая гибкость: добавление новых шагов или изменений требует внесения изменений в координатора.

Инструменты для оркестрации

Некоторые популярные инструменты для оркестрации:

  1. Camunda: это мощный BPMN-движок, который позволяет моделировать и управлять процессами.
  2. Zeebe: это более современный инструмент, разработанный той же командой, что и Camunda, но более лёгкий и ориентированный на микросервисы.

Хореография Saga

В модели хореографии у вас нет одного управляющего центра. Вместо этого микросервисы реагируют на события, происходящие вокруг. Например, в процессе оформления заказа:

  1. Сервис создания заказа публикует событие OrderCreated.
  2. Сервис управления складом получает это событие и пытается зарезервировать товары. Если успешно, он публикует событие StockReserved.
  3. Сервис выставления счетов обрабатывает событие StockReserved и выставляет счёт клиенту.

Каждый сервис отвечает за свою часть работы, а подключение происходит через обмен событиями.

Преимущества хореографии

  1. Гибкость: можно легко добавить новый сервис, который реагирует на существующие события.
  2. Высокая масштабируемость: нет единой точки отказа.
  3. Асинхронность: позволяет обрабатывать каждую часть процесса независимо.

Недостатки хореографии

  1. Сложность отладки: труднее разобраться, где что пошло не так, поскольку процесс распределён.
  2. Отсутствие централизованного "знания": сложно иметь полное представление о текущем состоянии саги.

Инструменты для хореографии

Инструменты, которые хорошо подходят для управления событиями:

  • Apache Kafka: предоставляет платформу для публикации/подписки на события.
  • RabbitMQ: ещё одна популярная система сообщений.
  • Eventuate: платформа, которая специально создана для реализации хореографии событийно-ориентированных систем.

Когда использовать оркестрацию, а когда хореографию?

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

Используйте оркестрацию, если:

  • Ваша бизнес-логика сложная и требуется строгий контроль за шагами процесса.
  • Вам нужно иметь централизованное управление процессом.

Используйте хореографию, если:

  • Ваши процессы достаточно автономны и вы хотите минимизировать зависимость между сервисами.
  • Важна гибкость и возможность добавлять/изменять шаги без изменения всей системы.

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

Сценарий

Представим, что у нас есть процесс оформления заказа, состоящий из шагов:

  1. Создание заказа.
  2. Резервирование товаров.
  3. Выставление счета.
  4. Отправка уведомления клиенту.

Реализация оркестрации


@Component
public class OrderSagaOrchestrator {

    // Инжектируем сервисы для выполнения шагов
    @Autowired
    private InventoryService inventoryService;

    @Autowired
    private BillingService billingService;

    @Autowired
    private NotificationService notificationService;

    public void startOrderSaga(Order order) {
        try {
            // Шаг 1: Резервируем товары
            inventoryService.reserveStock(order);

            // Шаг 2: Выставляем счет
            billingService.createInvoice(order);

            // Шаг 3: Уведомляем клиента
            notificationService.sendOrderConfirmation(order);

        } catch (Exception e) {
            // Если что-то пошло не так, выполняем компенсацию
            inventoryService.releaseStock(order);
        }
    }
}

Реализация хореографии


// Сервис заказа публикует событие
@Component
public class OrderService {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void createOrder(Order order) {
        // Логика создания заказа...

        // Публикуем событие
        kafkaTemplate.send("order-topic", "OrderCreated", order.getId());
    }
}

// Сервис склада обрабатывает событие "OrderCreated"
@Component
@KafkaListener(topics = "order-topic")
public class InventoryService {

    @KafkaHandler
    public void handleOrderCreated(String orderId) {
        // Логика резервирования товаров...

        // Публикуем событие "StockReserved"
        kafkaTemplate.send("inventory-topic", "StockReserved", orderId);
    }
}

// Сервис выставления счетов обрабатывает событие "StockReserved"
@Component
@KafkaListener(topics = "inventory-topic")
public class BillingService {

    @KafkaHandler
    public void handleStockReserved(String orderId) {
        // Логика выставления счета...

        // Публикуем событие "InvoiceCreated"
        kafkaTemplate.send("billing-topic", "InvoiceCreated", orderId);
    }
}

Выводы

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

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ