1

次のシナリオがあります。amqp クライアントを使用して、rabbitmq の pub/sub モデルを実装したいと考えています。特定の ID を購読している購読者がいます。そのIDの名前でキューを形成したい。その特定の ID にサブスクライブしたいすべてのサブスクライバーがその特定のキューにサブスクライブするようにします。だから私は、その ID を持つすべてのサブスクライバーの特定の ID に基づいて一意のキューを形成したいと考えています。しかし、私の場合、同じIDに対して異なるキューを形成しています(推測)。その結果、特定の ID のサブスクライバーは、すべてのサブスクライバーがすべてのメッセージを受信するにもかかわらず、ラウンド ロビン方式ですべてのメッセージを受信できます。以下は、私が使用しているコードです。

var express = require('express');
var amqp = require('amqp');
var app = express();
var httpServer = require('http').createServer();
var socketio = require('socket.io');
var io = socketio.listen(httpServer);
httpServer.listen(8000);

console.log("server started at port no 8000");

var rabbitConnection = amqp.createConnection({host:"localhost", port:"5672"});
var chatExchange;
rabbitConnection.on("ready", function()
{
	console.log("RabbitConnection got ready");
	chatExchange = rabbitConnection.exchange("chatExchange", {"type":"topic"});
	//console.log("value of chatExchange is :",chatExchange);
});

io.sockets.on("connection", function(socket)
{
	console.log("socket connected");
	socket.on("metaData", function(data)
	{
		if(data.type=="publisher")
		{
			console.log("publisher connected");
			socket.type="publisher";
		}
		else if(data.type=="subscriber")
		{
			console.log("subscriber connected");
			socket.type="subscriber";
			rabbitConnection.queue(""+data.channelName, function(queue)  //MAIN PROBLEM LIES IN ABOVE LINE I GUESS. IT WILL FORM QUEUE FOR EVERY SOCKET CONNECTION. BUT IT SHOULD NOT FORM QUEUE IF IT ALREADY EXISTS.
			{
				console.log("queue formed");
				console.log("queue is ", queue);
				queue.bind("chatExchange",""+data.channelName);
				queue.subscribe(function(message)
				{
					console.log("message is "+message.data.toString());
					console.log("message emitted");
					socket.emit("message",{"text":message.data.toString()});
				});
			});
		}
	}); 
	socket.on("disconnect",function()
	{	
		console.log("socket disconnected");
	});
	socket.on("message", function(data)
	{
		chatExchange.publish(""+data.channelName, data.text);
		console.log("message came");
	});
})

node-amqp モジュールのドキュメントを見てきました。しかし、キューの存在を確認するオプションが見つかりませんでした。いくつかの「永続性」オプションがありました。しかし、私はそれがうまくいくとは思わない。助けてください....よろしくお願いします..

4

0 に答える 0