Вопрос проверяет понимание распределённых транзакций и паттерна Saga для обеспечения согласованности данных в микросервисной архитектуре.
Saga — это архитектурный паттерн для управления распределёнными транзакциями в микросервисной архитектуре. Когда бизнес-операция затрагивает несколько сервисов с собственными базами данных, классические ACID-транзакции и двухфазный коммит (2PC) становятся плохим выбором: они блокируют ресурсы, плохо масштабируются и требуют жёсткой связности сервисов. Saga решает эту проблему, разбивая одну большую транзакцию на последовательность локальных транзакций, каждая из которых выполняется в рамках одного сервиса.
Каждый шаг Saga — это локальная транзакция, которая фиксируется сразу. Если все шаги прошли успешно, бизнес-операция считается завершённой. Если какой-то шаг падает, запускается цепочка компенсирующих транзакций, которые логически отменяют уже выполненные шаги. Важно понимать: компенсация — это не rollback в БД, а отдельная бизнес-операция, например возврат денег или отмена заказа.
// Saga: оформление заказа
async function placeOrder(order) {
const steps = [
{ do: () => reserveStock(order), undo: () => releaseStock(order) },
{ do: () => chargePayment(order), undo: () => refundPayment(order) },
{ do: () => shipOrder(order), undo: () => cancelShipment(order) },
];
const done = [];
for (const step of steps) {
try {
await step.do();
done.push(step);
} catch (e) {
// откатываем в обратном порядке
for (const s of done.reverse()) await s.undo();
throw e;
}
}
}Saga широко используется в e-commerce (заказ, оплата, доставка), финтехе (переводы между счетами), логистике и любых системах, где одна бизнес-операция затрагивает несколько сервисов. Паттерн даёт eventual consistency вместо строгой согласованности, что приемлемо для большинства бизнес-сценариев.
Итог: Saga стоит применять, когда нужно обеспечить согласованность данных между микросервисами без блокировок и 2PC, а бизнес готов принять eventual consistency и продумать компенсирующие операции для каждого шага.
Уровень
Рейтинг:
4
Сложность:
8
Навыки
Node.js
Kafka
Ключевые слова
Подпишись на Node.js Developer в телеграм