Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: Saga, distributed transactions, microservices, choreography, orchestration

Какие существуют способы реализации Saga?

Вопрос проверяет знание паттерна Saga для управления распределенными транзакциями в микросервисной архитектуре.

Короткий ответ

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

Длинный ответ

Что такое Saga?

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

Способы реализации

Существует два основных подхода к реализации Saga:

  • Хореография (Choreography) — каждый сервис после выполнения своей локальной транзакции публикует событие, на которое подписываются другие сервисы. Нет центрального координатора.
  • Оркестрация (Orchestration) — центральный координатор (оркестратор) управляет последовательностью шагов, отправляя команды сервисам и обрабатывая их ответы.

Пример хореографии

Предположим, система заказа: сервис заказов, сервис оплаты и сервис доставки. После создания заказа сервис заказов публикует событие OrderCreated. Сервис оплаты обрабатывает его и публикует PaymentProcessed или PaymentFailed. Сервис доставки реагирует на успешную оплату.

// Псевдокод для сервиса заказов
function createOrder(order) {
  // сохраняем заказ
  publishEvent('OrderCreated', order);
}

// Сервис оплаты
onEvent('OrderCreated', (event) => {
  if (processPayment(event.order)) {
    publishEvent('PaymentProcessed', event.order);
  } else {
    publishEvent('PaymentFailed', event.order);
  }
});

// Сервис доставки
onEvent('PaymentProcessed', (event) => {
  scheduleDelivery(event.order);
});

Пример оркестрации

Оркестратор (например, отдельный сервис или функция) вызывает сервисы по порядку. Если шаг не удался, он запускает компенсирующие действия.

// Псевдокод оркестратора
async function createOrderSaga(order) {
  try {
    await orderService.create(order);
    await paymentService.process(order);
    await deliveryService.schedule(order);
  } catch (error) {
    // Компенсация
    await orderService.cancel(order);
    await paymentService.refund(order);
  }
}

Когда что применять

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Node.js

    Node.js

  • Networks

Ключевые слова

#Saga

#distributed transactions

#microservices

#choreography

#orchestration

Подпишись на Java Developer в телеграм