AMQPlib nodejs消费者任务并发

时间:2017-03-31 20:34:16

标签: node.js rabbitmq amqp node-amqp

我正在使用amqlib模块使用rabbitmq和nodejs构建后台任务管理系统。

有些任务实际上是CPU消耗的,所以如果我启动了很多任务并且只有少数工作人员,我的服务器就会被杀死(使用太多的CPU)。

我想知道是否有办法创建一个amqp队列,这样我的消费者一次只会消耗这个队列中的一个任务(即在ack或拒绝之前,不要发送此类任务这个消费者)。 或者我应该自己在代码中处理这个问题(可能在我的工作者中保留一个引用,我正在处理此队列的任务并在执行任务时拒绝此队列的所有任务?)。

以下是我的示例代码:

我正在创建像

这样的amqp连接
const amqpConn = require('amqplib').connect('amqp://localhost');

我的队列名称为tasks

amqpConn.then((conn) => {
  return conn.createChannel();
}).then((ch) => {
  return ch.assertQueue('tasks').then((ok) => {
    ch.sendToQueue(q, new Buffer(`something to do ${i}`));
  });
}).catch(console.warn);

这是我的消费者(我想这是我应该做的工作,只限制这个队列的一个并发任务):

amqpConn.then((conn) => {
  return conn.createChannel();
}).then((ch) => {
  return ch.assertQueue('tasks').then((ok) => {
    return ch.consume('tasks', (msg) => {
      if (msg !== null) {
        console.log(msg.content.toString());
        ch.ack(msg);
      }
    });
  });
}).catch(console.warn);

非常感谢!

2 个答案:

答案 0 :(得分:1)

I'm wondering if there is a way to create an amqp queue so that my consumers will only consume one task of this queue at a time

如果这是你真正需要的那么,是的,只需要一个消费者并声明队列独占。这样就消耗了一个任务。

答案 1 :(得分:0)

我想我明白了:

  • 为每个队列创建一个频道
  • 使用频道的render(view: '/my-view')来限制每个用户的并发性

https://www.rabbitmq.com/consumer-prefetch.html