Вопрос проверяет знание паттерна Saga для управления распределенными транзакциями в микросервисной архитектуре.
Saga — это паттерн, который позволяет выполнять распределенные транзакции в микросервисной архитектуре, разбивая их на последовательность локальных транзакций. Каждая локальная транзакция имеет компенсирующее действие на случай отката. Это необходимо, когда одна операция затрагивает несколько сервисов, и требуется обеспечить согласованность данных без использования двухфазного коммита.
Существует два основных подхода к реализации Saga:
Предположим, система заказа: сервис заказов, сервис оплаты и сервис доставки. После создания заказа сервис заказов публикует событие 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 обязателен для обеспечения согласованности данных в распределенных системах. Хореография проще в реализации, но сложнее в отладке, а оркестрация дает больше контроля, но требует дополнительного компонента — оркестратора.