JavaRush /Курсы /Модуль 5. Spring /Лекция 214: Применение саг для управления бизнес-процесса...

Лекция 214: Применение саг для управления бизнес-процессами

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

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

Saga — это именно то, что помогает транзакциям оставаться последовательными в случае отказов. Она напоминают танец, где два партнёра следуют определённым фигурам: если один сбивается, другой помогает вернуться в ритм. В данном случае этот "танец" касается данных и логики бизнес-процессов.


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

Saga наиболее полезна в процессах, которые:

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

Примером может быть процесс обработки заказа, уже упомянутый выше. Давайте разберём его подробнее.

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

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

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


Как Saga помогает в управлении бизнес-процессами

Saga помогает:

  1. Координировать процессы между микросервисами. Вместо того чтобы писать сложный код для управления процессом вручную, мы определяем шаги и обратные действия (компенсации) для каждой транзакции.
  2. Обеспечивать отказоустойчивость. Если один из шагов не может быть выполнен, сага инициирует компенсирующие действия для возврата системы в стабильное состояние.
  3. Сократить время на разработку. Стандартизированный подход саг даёт возможность быстрее проектировать надёжные процессы.

Из чего состоит 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, вы готовы перейти к практике и начать строить по-настоящему отказоустойчивые бизнес-процессы! Продуктиыной тренировки!

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