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

Ответ

В архитектуре микросервисов на 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.

Ответ 18+ 🔞

А, микросервисы, Node.js и RabbitMQ! Ну, ёпта, классика жанра, прямо как будто на дворе 2018-й год. Слушай, тут история про то, как мы эту асинхронную хуйню настраивали, просто пиздопроебибна по своей простоте, если разобраться.

Так вот, смотри. У нас там куча сервисов болталась, и чтобы они не общались напрямую, как гомосеки налетели, мы впендюрили RabbitMQ. И главный вопрос был — а сколько, блядь, этих самых consumer-сервисов на каждую очередь вешать? А то можно и овердохуища наделать, и тогда всё накроется медным тазом.

Самые важные заказы (orders.queue) — это святое. Тут доверия ебать ноль, надо чтобы всё летало и не падало. Поэтому мы там разворачивали от трёх до пяти инстансов consumer'а на Node.js. Один сдохнет — остальные подхватят, нагрузка распределится. Умно, да? Просто ебушки-воробушки.

А вот очередь для email-уведомлений (email.notifications) — это уже похуй. Ну, не совсем похуй, но там срочности нет. Отправится письмо сейчас или через пять секунд — какая разница? Главное — не отправить его пять раз одной жопе. Поэтому consumer там был один, хитрая жопа, чтобы дублей не было.

Ну и dead letter очередь (dlx.orders) — это вообще могильник для сообщений-неудачников. Туда всё с ошибками валится. На неё мы повесили одного consumer'а-одиночку, который только и делает, что логи пишет, чтобы потом можно было разобраться, что за хуйня произошла. Без него — вообще ни хуя себе, в темноте бы сидели.

Вот, кстати, как примерно выглядел наш 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();

И самое главное — как проверить, не обманывают ли тебя? А очень просто. У RabbitMQ есть HTTP API. Ты лезешь по адресу типа /api/queues/{vhost}/{queue} и смотришь там поля consumer_details или consumers. Там тебе прямо цифрой скажут, сколько этих самых consumer'ов на очередь висит. Если написано ноль, а очередь растёт — всё, пидарас шерстяной, consumer твой сдох, беги смотреть логи. Вот и вся магия, ебать колотить.