> Что такое саги в микросервисах (JavaScript)
Уровень: junior · Роль: backend · Язык: JavaScript · Категория: Технические вопросы
Компании: TrendTech
Стек: Node.js, JavaScript
> Пример ответа
Саги (Sagas) — это паттерн управления распределёнными транзакциями в микросервисной архитектуре. В отличие от монолитных систем, где транзакции атомарны (ACID), в микросервисах каждая операция может затрагивать несколько сервисов, и обеспечить согласованность данных сложнее. Сага разбивает глобальную транзакцию на последовательность локальных транзакций, каждая из которых выполняется в отдельном сервисе. Если одна из них завершается неудачно, сага запускает компенсирующие действия (rollback) для отмены предыдущих шагов.
Существует два основных подхода к реализации саг:
- Хореография (Choreography) — каждый сервис публикует события (например, через RabbitMQ или Kafka), и другие сервисы реагируют на них. Нет центрального координатора. Пример: сервис заказов публикует событие
OrderCreated, сервис оплаты подписывается и обрабатывает его. - Оркестрация (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; выбор между хореографией и оркестрацией зависит от сложности бизнес-логики и требований к наблюдаемости.
> Похожие задачи по JavaScript
Какие приоритеты при выборе вакансии
Что такое двухфазная фиксация в микросервисах
Насколько жестко проект был разделен на ограниченные контексты и агрегаты в DDD
Какая библиотека для IoC контейнера использовалась
> Похожие задачи по backend
Что хранится в стеке и в куче в Java
Что такое двухфазная фиксация в микросервисах
Как организовать транзакционность в микросервисной архитектуре при работе с разными базами данных
В чем отличие ноды, пода и сервиса в Kubernetes
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью