Коли ми починаємо говорити про керування бізнес-процесами, стає зрозуміло, що Saga — це не просто черговий патерн з підручника. Вона — рятівний круг для складних процесів, де задіяно кілька мікросервісів. Уяви інтернет-магазин: користувач оформлює замовлення, система перевіряє наявність товарів на складі, резервує їх, списує гроші і повідомляє службу доставки. Кожен крок тут має свою специфіку: від зовнішніх API до взаємодій з базою даних. А що якщо на якомусь етапі щось піде не так? Гроші списані, а товар не зарезервований? Ось тут і з'являється Saga.
Saga — це саме те, що допомагає транзакціям залишатися послідовними у випадку відмов. Вона нагадує танець, де партнери виконують певні фігури: якщо один збивається, інший допомагає повернутися в ритм. У нашому випадку цей "танець" стосується даних і логіки бізнес-процесів.
Інтеграція Saga в бізнес-процеси
Saga найбільш корисна в процесах, які:
- Включають кілька мікросервісів, що виконують свої частини транзакцій.
- Вимагають виконання дій строго в певній послідовності.
- Мають гарантувати відкат операцій при помилці.
Прикладом може бути процес обробки замовлення, уже згаданий вище. Розберемо його детальніше.
Візьмемо трохи прикрашений (але життєвий) приклад. Процес замовлення виглядає таким чином:
- Створення замовлення — користувач обирає товар і оформлює замовлення.
- Перевірка на складі — система перевіряє наявність товарів на складі.
- Резервування товару — якщо товар є в наявності, його резервують.
- Списання грошей — система списує гроші з банківської картки клієнта.
- Повідомлення доставки — замовлення передається на виконання в службу доставки.
Кожен із цих кроків може оброблятися різними мікросервісами. Saga тут допоможе зробити процес надійним: якщо крок "Резервування товару" не вдасться (наприклад, товар закінчився), можна відкотити раніше зроблені операції (наприклад, скасувати створення замовлення).
Як Saga допомагає в керуванні бізнес-процесами
Saga допомагає:
- Координувати процеси між мікросервісами. Замість того, щоб писати складний код для ручного керування процесом, ми визначаємо кроки і зворотні дії (компенсації) для кожної транзакції.
- Забезпечувати відмовостійкість. Якщо один із кроків не може бути виконаний, Saga ініціює компенсуючі дії, щоб повернути систему в стабільний стан.
- Скоротити час на розробку. Стандартизований підхід Saga дає змогу швидше проєктувати надійні процеси.
З яких елементів складається Saga?
- Кроки — це дії, що виконуються в рамках транзакції. Наприклад, "резервування товару".
- Компенсаційні кроки — це дії, які відміняють зміни, зроблені на попередніх кроках. Наприклад, "скасувати резерв товару".
- Менеджер 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, ви готові перейти до практики і почати будувати по-справжньому відмовостійкі бізнес-процеси! Продуктивного тренування!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ