Как откатить операцию в микросервисной архитектуре
1️⃣ Как кратко ответить
В микросервисной архитектуре откат операции обычно реализуется через паттерн "Saga". Существует два типа Saga: оркестрация и хореография. Оркестрация использует центральный координатор для управления транзакциями, тогда как хореография полагается на обмен событиями между микросервисами. Откат достигается через выполнение компенсирующих операций, которые отменяют эффекты предыдущих шагов.
2️⃣ Подробное объяснение темы
В микросервисной архитектуре каждая служба обычно управляет своей собственной базой данных и выполняет свои операции независимо. Это создает сложности при реализации транзакций, которые затрагивают несколько микросервисов, поскольку традиционные распределенные транзакции (например, двухфазный коммит) не всегда подходят из-за их сложности и влияния на производительность.
Для решения этой проблемы используется паттерн "Saga". Saga — это последовательность транзакций, где каждая транзакция обновляет данные в одном микросервисе и публикует событие или сообщение. Если одна из транзакций не удается, выполняются компенсирующие транзакции для отката изменений, сделанных предыдущими транзакциями.
Типы Saga:
-
Оркестрация:
- В этом подходе используется центральный координатор (оркестратор), который управляет выполнением всех шагов Saga.
- Оркестратор отправляет команды микросервисам для выполнения операций и ожидает их завершения.
- Если одна из операций не удается, оркестратор инициирует выполнение компенсирующих операций для всех предыдущих успешных шагов.
Пример:
public class OrderSagaOrchestrator { private final OrderService orderService; private final PaymentService paymentService; private final InventoryService inventoryService; public OrderSagaOrchestrator(OrderService orderService, PaymentService paymentService, InventoryService inventoryService) { this.orderService = orderService; this.paymentService = paymentService; this.inventoryService = inventoryService; } public void executeOrderSaga(Order order) { try { orderService.createOrder(order); // Создание заказа paymentService.processPayment(order); // Обработка платежа inventoryService.reserveInventory(order); // Резервирование товара } catch (Exception e) { // Если что-то пошло не так, откатываем все операции inventoryService.releaseInventory(order); // Освобождение зарезервированного товара paymentService.refundPayment(order); // Возврат платежа orderService.cancelOrder(order); // Отмена заказа } } } -
Хореография:
- В этом подходе нет центрального координатора. Вместо этого микросервисы обмениваются событиями.
- Каждый микросервис реагирует на события, которые его интересуют, и выполняет свою часть работы.
- Если операция не удается, микросервис публикует событие, которое инициирует выполнение компенсирующих операций в других микросервисах.
Пример:
public class OrderService { public void handleOrderCreatedEvent(OrderCreatedEvent event) { try { // Логика обработки заказа // ... publishEvent(new OrderCompletedEvent(event.getOrderId())); } catch (Exception e) { publishEvent(new OrderFailedEvent(event.getOrderId())); } } } public class PaymentService { public void handleOrderCompletedEvent(OrderCompletedEvent event) { try { // Логика обработки платежа // ... } catch (Exception e) { publishEvent(new PaymentFailedEvent(event.getOrderId())); } } public void handleOrderFailedEvent(OrderFailedEvent event) { // Логика возврата платежа // ... } }
Зачем это нужно: Saga позволяет управлять сложными бизнес-процессами, которые требуют координации между несколькими микросервисами, обеспечивая при этом согласованность данных и возможность отката операций в случае ошибок. Это особенно важно в системах, где недопустимо оставлять данные в неконсистентном состоянии, например, в финансовых приложениях или системах управления заказами.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться