我可以让每个消费者收到相同的消息吗?即两个消费者都收到消息1,2,3,4,5,6?这在 AMQP/RabbitMQ 中被称为什么?一般情况下是如何配置的呢?
不,没有消费者在同一个队列上。来自 RabbitMQAMQP 概念 guide:
重要的是要了解,在 AMQP 0-9-1 中,消息在消费者之间进行负载平衡。
这似乎暗示着队列中的循环行为是给定的,并且不可配置。即,需要单独的队列才能让多个消费者处理相同的消息ID。
这是常见的做法吗?我是否应该让交换器将消息路由到两个单独的队列中,并使用单个消费者?
不,不是,单个队列/多个消费者,每个消费者处理相同的消息 ID 是不可能的。让交换器将消息路由到两个单独的队列确实更好。
由于我不需要太复杂的路由,扇出交换会很好地处理这个问题。我之前并没有过多关注交换,因为 node-amqp 有“默认交换”的概念,允许您直接将消息发布到连接,但是大多数 AMQP 消息都会发布到特定交换。
这是我的扇出交换,包括发送和接收:
var amqp = require('amqp');
var connection = amqp.createConnection({ host: "localhost", port: 5672 });
var count = 1;
connection.on('ready', function () {
connection.exchange("my_exchange", options={type:'fanout'}, function(exchange) {
var sendMessage = function(exchange, payload) {
console.log('about to publish')
var encoded_payload = JSON.stringify(payload);
exchange.publish('', encoded_payload, {})
}
// Recieve messages
connection.queue("my_queue_name", function(queue){
console.log('Created queue')
queue.bind(exchange, '');
queue.subscribe(function (message) {
console.log('subscribed to queue')
var encoded_payload = unescape(message.data)
var payload = JSON.parse(encoded_payload)
console.log('Recieved a message:')
console.log(payload)
})
})
setInterval( function() {
var test_message = 'TEST '+count
sendMessage(exchange, test_message)
count += 1;
}, 2000)
})
})