0

我使用 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'});
4

2 回答 2

0

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

队列非常轻量级,并且 RabbitMQ 是为处理许多队列而构建的,因此可以为每个选项卡创建一个队列。如果您仍然不确定,这篇文章可能会引起您的兴趣。作者构建了一个简单的聊天系统并对其进行了压力测试,表明 RabbitMQ 每秒可以轻松处理数千个队列和消息。

尽管每个用户只需要一个队列就可以做到这一点,但每个选项卡一个队列会容易得多……而且在使用 RabbitMQ 时,通常不需要进行此类优化*。

*(当然,也有例外)

于 2013-08-21T22:32:13.327 回答
0

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

于 2013-08-21T10:41:28.087 回答