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