JavaRush /Курси /Модуль 5. Spring /Лекція 214: Застосування Saga для керування бізнес-процес...

Лекція 214: Застосування Saga для керування бізнес-процесами

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

Коли ми починаємо говорити про керування бізнес-процесами, стає зрозуміло, що Saga — це не просто черговий патерн з підручника. Вона — рятівний круг для складних процесів, де задіяно кілька мікросервісів. Уяви інтернет-магазин: користувач оформлює замовлення, система перевіряє наявність товарів на складі, резервує їх, списує гроші і повідомляє службу доставки. Кожен крок тут має свою специфіку: від зовнішніх API до взаємодій з базою даних. А що якщо на якомусь етапі щось піде не так? Гроші списані, а товар не зарезервований? Ось тут і з'являється Saga.

Saga — це саме те, що допомагає транзакціям залишатися послідовними у випадку відмов. Вона нагадує танець, де партнери виконують певні фігури: якщо один збивається, інший допомагає повернутися в ритм. У нашому випадку цей "танець" стосується даних і логіки бізнес-процесів.


Інтеграція Saga в бізнес-процеси

Saga найбільш корисна в процесах, які:

  1. Включають кілька мікросервісів, що виконують свої частини транзакцій.
  2. Вимагають виконання дій строго в певній послідовності.
  3. Мають гарантувати відкат операцій при помилці.

Прикладом може бути процес обробки замовлення, уже згаданий вище. Розберемо його детальніше.

Візьмемо трохи прикрашений (але життєвий) приклад. Процес замовлення виглядає таким чином:

  1. Створення замовлення — користувач обирає товар і оформлює замовлення.
  2. Перевірка на складі — система перевіряє наявність товарів на складі.
  3. Резервування товару — якщо товар є в наявності, його резервують.
  4. Списання грошей — система списує гроші з банківської картки клієнта.
  5. Повідомлення доставки — замовлення передається на виконання в службу доставки.

Кожен із цих кроків може оброблятися різними мікросервісами. Saga тут допоможе зробити процес надійним: якщо крок "Резервування товару" не вдасться (наприклад, товар закінчився), можна відкотити раніше зроблені операції (наприклад, скасувати створення замовлення).


Як Saga допомагає в керуванні бізнес-процесами

Saga допомагає:

  1. Координувати процеси між мікросервісами. Замість того, щоб писати складний код для ручного керування процесом, ми визначаємо кроки і зворотні дії (компенсації) для кожної транзакції.
  2. Забезпечувати відмовостійкість. Якщо один із кроків не може бути виконаний, Saga ініціює компенсуючі дії, щоб повернути систему в стабільний стан.
  3. Скоротити час на розробку. Стандартизований підхід Saga дає змогу швидше проєктувати надійні процеси.

З яких елементів складається Saga?

  1. Кроки — це дії, що виконуються в рамках транзакції. Наприклад, "резервування товару".
  2. Компенсаційні кроки — це дії, які відміняють зміни, зроблені на попередніх кроках. Наприклад, "скасувати резерв товару".
  3. Менеджер Saga — це компонент (або бібліотека), який керує виконанням кроків. Він вирішує, які дії потрібно виконати далі або який крок компенсувати у разі помилки.

Приклад

Припустимо, ми проєктуємо систему для керування замовленнями в інтернет-магазині. Вимоги:

  • Успішне виконання всіх кроків операції: створення замовлення, резервування товарів, списання грошей, повідомлення доставки.
  • Відкат усіх операцій у разі помилки на будь-якому етапі.

Проєктування системи

Ось схема взаємодії мікросервісів через Saga-патерн:


[Order Service] -> Створити замовлення
    v
[Inventory Service] -> Зарезервувати товар
    v
[Payment Service] -> Списати гроші
    v
[Delivery Service] -> Повідомити службу доставки

Компенсаційні дії на випадок помилок:

  • Якщо не вдалося зарезервувати товар, замовлення в Order Service скасовується.
  • Якщо не вдалося списати гроші, резерв товару знімається.
  • Якщо не вдалося повідомити службу доставки, гроші повертаються користувачу.

Реалізація Saga

Крок 1: визначення кроків і компенсацій

Ось приклад коду для кроку резервування товару:


public class InventoryService {

    public void reserveProduct(String productId, int quantity) {
        // Логіка резервування товару
        System.out.println("Резервування товару: " + productId);
    }

    public void cancelReservation(String productId, int quantity) {
        // Логіка скасування резервування
        System.out.println("Скасування резервування товару: " + productId);
    }
}

Крок 2: менеджер Saga

Для оркестрації використаємо написаний вручну менеджер Saga.


public class SagaManager {

    private final List<SagaStep> sagaSteps = new ArrayList<>();

    public void addStep(SagaStep step) {
        sagaSteps.add(step);
    }

    public void execute() {
        Stack<SagaStep> executedSteps = new Stack<>();
        try {
            for (SagaStep step : sagaSteps) {
                step.perform();
                executedSteps.push(step);
            }
        } catch (Exception e) {
            while (!executedSteps.isEmpty()) {
                executedSteps.pop().compensate();
            }
        }
    }
}

Крок 3: визначення кроків в Saga

Кожен крок реалізується за допомогою інтерфейсу SagaStep.


public interface SagaStep {
    void perform();
    void compensate();
}

// Приклад реалізації кроку
public class ReserveInventoryStep implements SagaStep {

    private final InventoryService inventoryService;
    private final String productId;
    private final int quantity;

    public ReserveInventoryStep(InventoryService inventoryService, String productId, int quantity) {
        this.inventoryService = inventoryService;
        this.productId = productId;
        this.quantity = quantity;
    }

    @Override
    public void perform() {
        inventoryService.reserveProduct(productId, quantity);
    }

    @Override
    public void compensate() {
        inventoryService.cancelReservation(productId, quantity);
    }
}

Крок 4: запуск Saga

Тепер зберемо все докупи і запустимо Saga.


public class SagaExample {

    public static void main(String[] args) {
        InventoryService inventoryService = new InventoryService();

        SagaManager sagaManager = new SagaManager();
        sagaManager.addStep(new ReserveInventoryStep(inventoryService, "product-123", 2));

        // Додайте сюди інші кроки (наприклад, списання грошей, повідомлення доставки)

        sagaManager.execute();
    }
}

Переваги для бізнесу

Система на основі Saga:

  • Підтримує масштабованість. Можна додати нові кроки, не порушуючи існуючу логіку.
  • Гарантує консистентність даних навіть при збоях.
  • Забезпечує гнучкість. Вибір між оркестрацією і хореографією дозволяє підлаштуватися під різні сценарії.

Наприклад, Amazon, Uber і інші корпорації активно використовують Saga для керування ключовими бізнес-процесами. І якщо це працює для них, то точно згодиться й вам!


Тепер, коли у вас є розуміння застосування патерна Saga, ви готові перейти до практики і почати будувати по-справжньому відмовостійкі бізнес-процеси! Продуктивного тренування!

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