> Что такое саги в микросервисах (JavaScript)

Уровень: junior · Роль: backend · Язык: JavaScript · Категория: Технические вопросы

Компании: TrendTech

Стек: Node.js, JavaScript

> Пример ответа

Саги (Sagas) — это паттерн управления распределёнными транзакциями в микросервисной архитектуре. В отличие от монолитных систем, где транзакции атомарны (ACID), в микросервисах каждая операция может затрагивать несколько сервисов, и обеспечить согласованность данных сложнее. Сага разбивает глобальную транзакцию на последовательность локальных транзакций, каждая из которых выполняется в отдельном сервисе. Если одна из них завершается неудачно, сага запускает компенсирующие действия (rollback) для отмены предыдущих шагов.

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

  1. Хореография (Choreography) — каждый сервис публикует события (например, через RabbitMQ или Kafka), и другие сервисы реагируют на них. Нет центрального координатора. Пример: сервис заказов публикует событие OrderCreated, сервис оплаты подписывается и обрабатывает его.
  2. Оркестрация (Orchestration) — центральный координатор (оркестратор) управляет шагами саги, отправляя команды сервисам и отслеживая их ответы. Оркестратор часто реализуется как отдельный микросервис или с помощью библиотек (например, для Node.js — sagas в NestJS или bpmn-js).

На фронтенде саги не реализуются напрямую, но понимание паттерна важно для проектирования API и обработки ошибок. Например, при отправке запроса на создание заказа, фронтенд может получить временный идентификатор саги и периодически опрашивать статус (polling) или подписываться на WebSocket-уведомления о завершении/откате.

Пример на JavaScript (упрощённая хореография через события):

JAVASCRIPT
// Сервис заказов
const createOrder = async (orderData) => {
const order = await db.saveOrder(orderData);
await eventBus.publish('order.created', { orderId: order.id });
};
// Сервис оплаты
eventBus.subscribe('order.created', async ({ orderId }) => {
try {
await paymentService.charge(orderId);
await eventBus.publish('payment.success', { orderId });
} catch (err) {
await eventBus.publish('payment.failed', { orderId });
}
});
// Компенсирующее действие при неудаче
eventBus.subscribe('payment.failed', async ({ orderId }) => {
await orderService.cancelOrder(orderId); // отмена заказа
});

Ключевые моменты для собеседования: саги решают проблему распределённых транзакций, обеспечивая eventual consistency; выбор между хореографией и оркестрацией зависит от сложности бизнес-логики и требований к наблюдаемости.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью