Проверяет понимание стратегий обеспечения согласованности и отката транзакций в распределённых системах, что критично для надёжности микросервисной архитектуры.
В распределённой системе транзакция может затрагивать несколько независимых сервисов, каждый из которых имеет свою базу данных. Традиционный ACID-подход с двухфазным коммитом (2PC) не масштабируется и снижает доступность. Поэтому для отката изменений применяется паттерн Saga.
Saga — это последовательность локальных транзакций. Каждая локальная транзакция обновляет данные в одном сервисе и публикует событие или сообщение, которое запускает следующую локальную транзакцию. Если какая-то локальная транзакция завершается неудачей, Saga запускает компенсирующие транзакции для отмены предыдущих шагов.
Существует два основных подхода к реализации Saga:
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
Networks
Ключевые слова
Подпишись на Java Developer в телеграм