在多个节点实例中共享IO对象

时间:2013-12-05 09:33:14

标签: node.js redis socket.io

我想在两个节点实例之间共享socket.io创建的空间,已经使用redis-store但无法在不同的节点实例上获取io.sockets.in(ROOM_ID).emit(MESSAGE,DATA);

我正在尝试 - 实例A -

io.set('store',...)

io.on('connection',function(socket){
   socket.join(''room-ABCD);
});

要做广泛的事情,我可以使用

io.sockets.in('room-ABCD').emit('event',{data:{}});

但我需要从实例B执行类似的广播。

实例B io.set('store')上的

与上面类似,但我无法使用io.sockets.in('room-ABCD').emit('event',{data:{}})

我的理解是 - redisStore会将socket + room信息放在redis中,以便其他进程可以访问。[如果我错了,请更正]。 现在,我没有得到如何在节点的其他进程中识别和获取此信息。

感谢。

2 个答案:

答案 0 :(得分:0)

如果我很好地理解你的问题。你的起点是question 您可以从B访问A(主机不是redis)。所以在A中你可以推动你需要在A:

上发射
LPUSH dataToEmit "{'room':'room-ABCD', 'data':'<escapeddata>'}" 

在您的A进程中,您在dataToEmit上执行BRPOP,在回调中,您可以取消并发出您想要的内容

也许您也可以为1个房间发送1个密钥。不要忘记,你可以使用特定的数据库编号

我希望migth帮助你

答案 1 :(得分:0)

回答与问题相关的问题 - onetwo和此问题。

我需要集中注意力的确切点是 - 加入房间。

我正在使用client_socket.join("room_name"),但它将客户端套接字推送到房间。

现在,试试io.sockets.socket(client_socket.id).join("room_name")

这将房间成员推送到redis,现在可以在另一个节点实例中访问它们。

过程B中的

io.sockets.in("room_name").emit("event_name",{data:"1"})有效。