Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: distributed transactions, saga pattern, rollback, compensating transaction, eventual consistency

Как организовать откат изменений в распределённой системе?

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

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

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

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

Проблема отката в распределённых системах

В распределённой системе транзакция может затрагивать несколько независимых сервисов, каждый из которых имеет свою базу данных. Традиционный ACID-подход с двухфазным коммитом (2PC) не масштабируется и снижает доступность. Поэтому для отката изменений применяется паттерн Saga.

Паттерн Saga

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

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

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

Пример на JavaScript (оркестрация)

class SagaOrchestrator {
  async executeOrder(order) {
    try {
      await this.serviceA.reserveStock(order);
      await this.serviceB.processPayment(order);
      await this.serviceC.confirmShipping(order);
    } catch (error) {
      await this.compensate(order, error.step);
    }
  }

  async compensate(order, failedStep) {
    if (failedStep > 0) await this.serviceC.cancelShipping(order);
    if (failedStep > 1) await this.serviceB.refundPayment(order);
    if (failedStep > 2) await this.serviceA.releaseStock(order);
  }
}

Вывод

Паттерн Saga является стандартным способом обеспечения согласованности данных в распределённых системах, где требуется откат изменений. Он предпочтителен для микросервисных архитектур, где важна высокая доступность и масштабируемость, и где допустима временная несогласованность (eventual consistency).

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Node.js

    Node.js

  • Networks

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

#distributed transactions

#saga pattern

#rollback

#compensating transaction

#eventual consistency

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