node.js - AMQPlib Nodejs 消费者任务并发

标签 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);

非常感谢!

最佳答案

我想知道是否有一种方法可以创建一个 amqp 队列,以便我的消费者一次只会消耗该队列的一个任务

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

关于node.js - AMQPlib Nodejs 消费者任务并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43149244/

相关文章:

mysql - 使用express显示node mysql结果

node.js - Meteor 中的后台工作人员和 REST 服务

node.js - 电子邮件验证后自动登录用户(Express/passport)

python - 如何使用 py-amqplib 在多个队列上等待消息

azure - 如何设置 Azure EventHub 以在 .NET 客户端中使用 HTTP 或 AMQP?

node.js - 使用发布者确认 RabbitMQ,在什么情况下发布者会收到成功/失败的通知?

javascript - Webpack - 语法错误 : Unexpected token {

django - 为什么我在 Heroku 上有这么多使用 CloudAMQP 的 Celery 消息?

java - 使用 spring 管理 Kafka 主题

memory - 为什么rabbitmq上的二进制内存使用量会增加