【发布时间】:2017-03-31 20:34:16
【问题描述】:
我正在使用amqlib 模块构建一个带有rabbitmq 和nodejs 的后台任务管理系统。
有些任务真的很消耗 CPU,所以如果我要启动很多任务,而我只有几个工作人员,我的服务器可能会被杀死(使用过多的 CPU)。
我想知道是否有一种方法可以创建一个 amqp 队列,这样我的消费者一次只会使用该队列的一个任务(即在确认或拒绝之前,不要将此类任务发送到这个消费者)。 或者我应该在代码中自己处理这个问题(也许在我的工作人员中保留一个引用,说明我正在处理此队列的任务并在执行任务时拒绝此队列的所有任务?)。
这是我的示例代码:
我正在创建这样的 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);
非常感谢!
【问题讨论】:
-
我已经有一段时间没有使用 RabbitMQ 了,但是看看at this。
标签: node.js rabbitmq amqp node-amqp