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

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

Модуль 5. Spring
Рівень 14 , Лекція 2
Відкрита

Якщо уявити розподілену систему як великий музичний оркестр, то є два підходи до керування її виконанням: оркестрація та хореографія.

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

Різниці між оркестрацією та хореографією

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

Оркестрація саг

У випадку оркестрації є один центральний компонент, який керує всіма кроками саги. Це свого роду "координатор саги". Він знає, які дії потрібно виконати, у якій послідовності і що робити, якщо щось іде не так.

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

  1. Створенням замовлення.
  2. Резервуванням товарів на складі.
  3. Виставленням рахунку клієнту.

Якщо на одному з цих кроків щось піде не так, координатор скаже: "Окей, скасовуємо замовлення".

Переваги оркестрації

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

Недоліки оркестрації

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

Інструменти для оркестрації

Деякі популярні інструменти для оркестрації:

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

Хореографія саг

У моделі хореографії немає одного керуючого центру. Натомість мікросервіси реагують на події, що відбуваються навколо. Наприклад, у процесі оформлення замовлення:

  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);
    }
}

Висновки

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

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ