Вопрос проверяет понимание паттернов распределённых транзакций и умение выбирать способ согласования данных между микросервисами без общей БД.
В монолите одна транзакция базы данных гарантирует атомарность: либо все изменения применяются, либо ни одно. В микросервисах у каждого сервиса своя база, и общей транзакции нет. Поэтому приходится выбирать между строгой согласованностью и масштабируемостью, применяя специальные паттерны согласования.
class OrderSaga {
async execute(order) {
try {
await paymentService.charge(order); // шаг 1
await inventoryService.reserve(order); // шаг 2
await shippingService.schedule(order); // шаг 3
} catch (e) {
await inventoryService.release(order); // компенсация
await paymentService.refund(order); // компенсация
throw e;
}
}
}2PC уместен внутри одной системы с малым числом участников и требованием строгой согласованности. Сага — стандарт для микросервисов, где важны автономность и масштабируемость. Outbox обязателен, если вы публикуете события после изменения данных.
Итог: в большинстве микросервисных систем применяют сагу с eventual consistency, дополняя её паттерном Outbox и идемпотентными обработчиками, а 2PC оставляют для узких случаев со строгими требованиями к атомарности.
Уровень
Рейтинг:
5
Сложность:
8
Навыки
Node.js
Kafka
Ключевые слова
Подпишись на Node.js Developer в телеграм