0

開発チャットにはrabbitMq、nodeJs(socet.io、amqpモジュールを使用)、ZF2を使用しています

デフォルトでは、RabbitMq はヘルプ ラウンド ロビンでキューからメッセージを送信します。

すべてのサブスクライバー キューに同じメッセージを送信する RabbitMq の機会はありますか?

例:接続ごとにキューを作成すると、それは正しく機能しますが、ユーザーがブラウザで2つのタブを開くと、2つのキューが作成されます。良くないと思います。

ユーザーごとに1つのキューが必要です(それを行う場合、最初のメッセージが最初のタブに送信され、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の交換を使用できます。ここを参照してください!バインドされた各キューにメッセージをブロードキャストします。ただし、1 つのキューに 2 つのコンシューマー (コールバック) をアタッチしている場合、それらの 2 つのコンシューマー (コールバック) は引き続きラウンドロビン方式で供給されます。

キューは非常に軽量であり、RabbitMQ は多くのキューを処理するように構築されているため、タブごとにキューを作成しても問題ありません。それでもわからない場合は、この投稿が参考になるかもしれません。著者は単純なチャット システムを構築し、それをストレス テストして、RabbitMQ が 1 秒あたり数千のキューとメッセージを簡単に処理できることを示しました。

ユーザーごとに 1 つのキューだけでこれを行うことは可能ですが、タブごとに 1 つのキューを使用するとはるかに簡単になります...そして、RabbitMQ を使用する場合、通常、そのような最適化を行う必要はありません*。

※(もちろん例外もあります)

于 2013-08-21T22:32:13.327 に答える