在多个节点实例中使用Pub-Sub进行广播

时间:2013-12-04 12:25:29

标签: node.js redis socket.io publish-subscribe

我希望有2个节点服务器'A'和'B'的实例。

'A'将在房间中推送已连接的客户端[socket.io]。

'A'将发布已经订阅'B'的事件。

在从'A'接收到该特定事件时,实例'B'将在给定房间中广播消息。想要使用socket.io的Room功能

想问一下,有可能吗? 我正在尝试redis商店,但没有得到如何发布一个事件,以便服务器'B'将接收它。

1 个答案:

答案 0 :(得分:1)

你可以运行2个redis实例,一个在服务器A上,一个在服务器B上。

如果你将A上的地址绑定到*或127.0.0.1,B的IP,你可以要求服务器B成为A的奴隶:slaveof <A ip adress> 6379

A发布的每个发布都将复制到B,因此您可以将B服务器收听到频道并将您想要的内容推送到会议室

有关您的信息,您可以启动服务器进行测试,如下所示: 在A:

redis-server --port 6391 --bind (B-IP) --bind 127.0.0.1

在B:

redis-server --port 6392 --slaveof (A-IP) 6391

我没有对此解决方案进行全面测试(仅在本地主机上测试了两次服务器),但这应该可行

如果您想要处理某些键,可以使用psubscribe和一些“键”作为通道名称。我之前做过这样的事情:

在A

publish "|key1=toto||key2=titi||key3=plop|" "nanana"

在B

PSUBSCRIBE "*|key2=titi|*"

当您在密钥上看到分隔符时,您将只有过滤推送

你可以在你的node / socketIo中做类似的事情: 在A

var redis = require("redis");
client = redis.createClient();
client.publish("room::"+roomID, message);

在B

var redis = require("redis");
client = redis.createClient();
client.on("pmessage", function (pattern,channel, message){
    //emit on roomid(in channel) the message
}
client.psubscribe("room::*");

未经测试......