Руководство для начинающих по шаблону Saga для распределенных транзакций — хореография и оркестровка

Привет! Сегодня я собираюсь провести вас через увлекательный мир шаблона Saga для распределенных транзакций. Мы рассмотрим два популярных подхода: хореографию и оркестровку. Но не волнуйтесь, если эти термины покажутся вам пугающими — я разберу их простым языком и по ходу дела приведу примеры кода. Итак, приступим!

Введение в шаблон Saga

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

Хореографический подход

Хореографический подход – это децентрализованный способ координации транзакций между службами. Каждая служба в системе сотрудничает с другими, публикуя события и реагируя на события, опубликованные другими службами.

Давайте рассмотрим пример, где у нас есть две службы: служба заказов и служба платежей. Когда пользователь размещает заказ, служба заказов публикует событие OrderPlaced. Платежный сервис подписывается на это событие и обрабатывает платеж. Если платеж успешен, он публикует событие «PaymentProcessed», которое запускает дальнейшие действия, например отправку заказа.

Вот упрощенный фрагмент кода в Node.js, иллюстрирующий хореографический подход:

// Order Service
function placeOrder(order) {
  // Process order logic...
  // Publish OrderPlaced event
  eventBus.publish("OrderPlaced", { orderId: order.id });
}
// Payment Service
eventBus.subscribe("OrderPlaced", (event) => {
  const orderId = event.orderId;
  // Process payment logic...
  // Publish PaymentProcessed event
  eventBus.publish("PaymentProcessed", { orderId });
});

Подход к оркестровке

В отличие от хореографического подхода, подход оркестровки централизует логику координации в специальном компоненте, называемом оркестратором. Оркестратор контролирует поток транзакции, явно вызывая необходимые службы.

Продолжая наш предыдущий пример, мы можем представить службу Orchestrator, которая координирует размещение заказов и обработку платежей:

// Orchestrator Service
function placeOrderWithPayment(order) {
  // Process order logic...
  // Invoke Order Service
  const orderPlacedEvent = orderService.placeOrder(order);
  // Invoke Payment Service
  const paymentProcessedEvent = paymentService.processPayment(orderPlacedEvent.orderId);
  // Further actions...
}

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

Выбор между хореографией и оркестровкой

Теперь, когда мы изучили оба подхода, возможно, вам интересно, какой из них выбрать. Ну, это зависит от сложности и требований вашей системы.

  • Хореография хорошо работает, когда у вас большое количество сервисов и вы хотите избежать централизованного оркестратора. Это способствует слабой связи между сервисами, но по мере роста системы это становится сложнее рассуждать.

  • Оркестрация хорошо подходит, если у вас небольшое количество сервисов и вы хотите централизованно контролировать поток транзакций. Он дает четкое представление о выполнении транзакции, но может привести к возникновению единой точки отказа.

В конечном итоге выбор между хореографией и оркестровкой зависит от таких факторов, как сложность системы, опыт команды и терпимость к неудачам.

Подведение итогов

В этой статье мы рассмотрели шаблон Saga для распределенных транзакций, уделив особое внимание подходам к хореографии и оркестровке. Мы видели, как хореография использует события для координации действий между службами, а оркестрация централизует управление в компоненте оркестратора.

Помните, что не существует универсального решения, и выбор между хореографией и оркестровкой зависит от вашего конкретного варианта использования. Понимание преимуществ и недостатков каждого подхода поможет вам разработать надежные и масштабируемые распределенные системы.

Надеюсь, эта статья пролила для вас некоторый свет на паттерн Saga. Приятного кодирования!