Работали ли вы с системами сообщений (message brokers) в Node.js?

«Работали ли вы с системами сообщений (message brokers) в Node.js?» — вопрос из категории Брокеры сообщений, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, интегрировал системы обмена сообщениями в нескольких распределенных Node.js-приложениях. Выбор конкретного брокера зависел от требований проекта.

RabbitMQ (AMQP): Использовал для микросервисной архитектуры в проекте по обработке заказов, где важна гарантированная доставка и routing flexibility.

// Producer с подтверждениями
const channel = await connection.createChannel();
await channel.assertExchange('orders', 'direct', { durable: true });
await channel.assertQueue('order.process', { durable: true });
await channel.bindQueue('order.process', 'orders', 'new.order');

// Публикация с persistent сообщениями
channel.publish('orders', 'new.order', Buffer.from(JSON.stringify(order)), {
  persistent: true,
  contentType: 'application/json',
  headers: { 'retry-count': 0 }
});

// Consumer с обработкой ошибок и retry логикой
channel.consume('order.process', async (msg) => {
  try {
    const order = JSON.parse(msg.content.toString());
    await processOrder(order);
    channel.ack(msg);
  } catch (error) {
    // DLQ паттерн
    if (msg.properties.headers['retry-count'] >= 3) {
      channel.sendToQueue('order.dlq', msg.content, { persistent: true });
      channel.ack(msg);
    } else {
      channel.nack(msg, false, false); // Отправка в retry очередь
    }
  }
}, { noAck: false });

Kafka: Применял в аналитической платформе для обработки потоковых данных. Использовал kafkajs с consumer groups и exactly-once семантикой там, где это было критично.

Практические решения:

  • Реализовал dead letter queues для обоих брокеров
  • Настраивал мониторинг через Prometheus метрики (сообщения в очередях, latency)
  • Использовал schema registry (Confluent) с Avro для контрактов сообщений в Kafka