> Как организовать транзакционность в микросервисной архитектуре при работе с разными базами данных (Node.js, JavaScript)

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

Компании: TrendTech

Стек: Node.js, JavaScript

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

В микросервисной архитектуре с разными базами данных традиционные ACID-транзакции невозможны. Основной подход - Saga-паттерн. Он разбивает распределённую транзакцию на последовательность локальных шагов, каждый из которых выполняется в отдельном сервисе и сохраняет данные в своей БД. При сбое выполняются компенсирующие действия (откат).

Пример реализации на Node.js с использованием очередей (например, RabbitMQ или Kafka):

JAVASCRIPT
// Сервис заказов
async function createOrder(orderData) {
const order = await db.orders.create(orderData);
await eventBus.publish('order.created', { orderId: order.id, userId: orderData.userId });
}
// Сервис платежей (подписчик на событие)
async function handleOrderCreated({ orderId, userId }) {
try {
const payment = await db.payments.create({ orderId, userId, amount: 100 });
await eventBus.publish('payment.success', { orderId, paymentId: payment.id });
} catch (error) {
await eventBus.publish('payment.failed', { orderId, reason: error.message });
}
}
// Компенсирующее действие (если платеж не прошёл)
async function handlePaymentFailed({ orderId }) {
await db.orders.update({ id: orderId, status: 'cancelled' });
// Можно также вернуть товары на склад в другом сервисе
}

Дополнительные практики:

  • Используйте outbox-паттерн для гарантии доставки событий (сохраняйте событие в той же БД, что и данные, затем асинхронно отправляйте).

  • Для критичных операций применяйте двухфазный коммит (2PC) только если сервисы используют одну СУБД (например, PostgreSQL через XA-драйверы), но это снижает производительность.

  • В простых случаях можно использовать TCC (Try-Confirm/Cancel): резервируйте ресурсы на первом шаге, подтверждайте или отменяйте позже.

Выбор зависит от требований к согласованности: для eventual consistency подходят Sagas, для строгой - 2PC или распределённые блокировки через Redis.

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

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