如何向所有lissener队列发送一条消息?

时间:2013-08-21 10:06:25

标签: node.js queue rabbitmq amqp

我使用rabbitMq,nodeJs(使用socet.io,amqp模块),ZF2进行开发聊天

默认情况下,RabbitMq在帮助循环中从队列发送消息。

RabbitMq是否有机会向所有订阅者队列发送相同的消息?

例如: 如果我为每个连接创建其队列,那是正常的,但如果用户在他的浏览器上打开2个选项卡,那么将使2个队列。我觉得它不好。

我希望每个用户都有一个队列(如果我这样做,比第一个消息发送到第一个标签,第二个消息 - 第二个标签)

我的代码:

 var exchange = connectionAmqp.exchange('chat', {type: 'direct', passive: false, durable:false, autoDelete: false});


                    console.log(' [*] Client connected')

                    connectionAmqp.queue('chat'+userId.toString(), {
                        passive : false,
                        durable : false,
                        exclusive : false,
                        autoDelete: false
                    }, function(queue) {

                        //Catch new message from queue
                        queue.bind(exchange, userId.toString());
                        queue.subscribe(function(msg){                           
                             socket.emit('pullMessage', msg); //Emit message to browser         
                        })

                    });

从其他脚本我推送消息

var exchange = connectionAmqp.exchange('chat', {type: 'direct', passive: false, durable:false, autoDelete: false});
var data= {chatId:70,msg:"Text",time:1375333200}
exchange.publish('1', data, {contentType: 'application/json'});

2 个答案:

答案 0 :(得分:0)

确保队列不是独占的。然后确保客户端连接到同一队列。这可以完成,但让客户端创建队列并指定该队列的名称。命名算法将确保每个客户端的队列名称是唯一的,但对于同一客户端,它将生成相同的名称。两个选项卡将依次从同一队列中读取,以确保您正在寻找的循环效果。

答案 1 :(得分:0)

如果要向所有队列发送消息,可以使用扇出类型的交换。见here!它将向绑定到它的每个队列广播一条消息。但是,如果您在一个队列上附加两个消费者(回调),那么这两个消费者(回调)仍然会被循环使用。

队列非常轻量级,构建RabbitMQ来处理许多队列,因此可以为每个选项卡创建一个队列。如果您仍然不确定,这post可能符合您的利益。作者构建了一个简单的聊天系统并对其进行了压力测试,结果表明RabbitMQ每秒可以轻松处理数千个队列和消息。

尽管每个用户只需一个队列就可以做到这一点,但每个标签只有一个队列会更容易......而且当使用RabbitMQ时,通常不需要进行这样的优化*。

*(当然也有例外)