Какое количество потребителей (consumers) было подключено к одной очереди в RabbitMQ?

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

Ответ

В архитектуре микросервисов на Node.js мы использовали RabbitMQ для асинхронной коммуникации. Количество потребителей на очередь варьировалось в зависимости от задачи.

  • Для очереди заказов (orders.queue) мы запускали 3-5 экземпляров consumer-сервиса на Node.js для балансировки нагрузки и обеспечения отказоустойчивости.
  • Для очереди уведомлений по email (email.notifications) был один consumer, так как задача не была критичной по скорости, и мы избегали дублирования отправки.
  • Для dead letter очереди (dlx.orders) потребитель был один, логирующий ошибки для последующего анализа.

Пример кода consumer на Node.js с библиотекой amqplib:

const amqp = require('amqplib');

async function startOrderConsumer() {
  const connection = await amqp.connect('amqp://localhost');
  const channel = await connection.createChannel();
  const queue = 'orders.queue';

  await channel.assertQueue(queue, { durable: true });
  // Ограничиваем prefetch для честного распределения задач между потребителями
  channel.prefetch(1);

  console.log(` [*] Consumer PID ${process.pid} waiting for messages in ${queue}`);

  channel.consume(queue, (msg) => {
    if (msg !== null) {
      const order = JSON.parse(msg.content.toString());
      console.log(` [x] Processing order ${order.id}`);
      // ... логика обработки ...
      channel.ack(msg); // Подтверждаем обработку
    }
  }, { noAck: false });
}

startOrderConsumer();

Точное количество активных потребителей для конкретной очереди можно получить через HTTP API RabbitMQ (/api/queues/{vhost}/{queue}) — поле consumer_details или consumers.