【发布时间】:2012-05-24 03:49:45
【问题描述】:
我刚开始使用 RabbitMQ 和 AMQP。
- 我有一个消息队列
- 我有多个消费者,我想用相同的消息做不同的事情。
大多数 RabbitMQ 文档似乎都集中在循环,即单个消费者使用单个消息,负载在每个消费者之间分散。这确实是我目睹的行为。
一个例子:生产者有一个队列,每 2 秒发送一次消息:
var amqp = require('amqp');
var connection = amqp.createConnection({ host: "localhost", port: 5672 });
var count = 1;
connection.on('ready', function () {
var sendMessage = function(connection, queue_name, payload) {
var encoded_payload = JSON.stringify(payload);
connection.publish(queue_name, encoded_payload);
}
setInterval( function() {
var test_message = 'TEST '+count
sendMessage(connection, "my_queue_name", test_message)
count += 1;
}, 2000)
})
这是一个消费者:
var amqp = require('amqp');
var connection = amqp.createConnection({ host: "localhost", port: 5672 });
connection.on('ready', function () {
connection.queue("my_queue_name", function(queue){
queue.bind('#');
queue.subscribe(function (message) {
var encoded_payload = unescape(message.data)
var payload = JSON.parse(encoded_payload)
console.log('Recieved a message:')
console.log(payload)
})
})
})
如果我启动消费者两次,我可以看到每个消费者都在循环使用交替消息。例如,我将在一个终端中看到消息 1、3、5,在另一个终端中看到消息 2、4、6。
我的问题是:
我可以让每个消费者收到相同的消息吗?即,两个消费者都收到消息 1、2、3、4、5、6?这在 AMQP/RabbitMQ 中叫什么?正常是怎么配置的?
这通常会做吗?我是否应该让交换将消息路由到两个单独的队列中,而只有一个消费者?
【问题讨论】:
-
我不是 RabbitMQ 专家。但是,您现在拥有的称为队列,但您想要的是主题,请参阅本教程:rabbitmq.com/tutorials/tutorial-five-python.html,有关队列与主题的更多信息:msdn.microsoft.com/en-us/library/windowsazure/hh367516.aspx
-
我相信他实际上想要扇出,尽管主题也可以工作,并且稍后会给予更多控制。
-
感谢@UrbanEsc。主题似乎通过让一条消息到达多个队列来解决问题,因此被每个队列消费者消费。对于我的特殊情况,这让我更倾向于多队列/单一消费者场景。
-
对于 2018 年(甚至 2016 年及更早),答案是使用 Kafka、IMO 之类的东西。
标签: node.js messaging rabbitmq amqp node-amqp