Redis客户端广播问题(在Socket.IO的上下文中)

时间:2012-06-20 08:45:11

标签: redis socket.io scalability publish-subscribe disconnect

所以我读过一些关于扩展Socket.IO的文章。由于各种原因,我不想使用内置的Socket.IO扩展机制(大多数情况下看起来效率很低,因为从我的角度来看,它需要向Redis发布更多东西)。

所以我想出了这个简单的想法:

每个Socket.IO服务器创建Redis发布/订阅/存储客户端,连接到Redis并订阅频道。现在,当我想要广播数据时,我只是将它发布到Redis,所有其他Socket.IO服务器都将它发送给用户。

虽然存在问题(我认为这也是Socket.IO内置机制的一个问题)。假设我想知道所有连接用户的数量。至少有两种方法:

  1. 服务器A向Redis发布give_me_clients。然后每个Socket.IO服务器计算连接并发布number_of_clients。服务器A抓取此数据,将其合并并将其发送给客户端。

  2. 每当用户连接/断开服务器时,每台服务器都会在Redis中更新number_of_clients_for::ID_HERE。然后,服务器A只获取数据并将其组合。可能更有效率。

  3. 但这些解决方案存在问题:

    1. 服务器A不知道其他服务器。因此,他不知道何时应该停止听number_of_clients。可以通过使服务器A知道其他服务器来修复它:每当服务器连接到Redis时,他都会发布new_server(服务器A抓取数据并将其存储在内存中)。但是当Redis-Socket.IO连接中断时该怎么办?有没有办法让Redis通知客户端其中一个客户端已断开连接?

    2. 实际上和上面一样。当Socket.IO服务器崩溃如何清除number_of_clients数据?

    3. 所以真正的问题是:Redis能否通知(发布给chanel)客户端与其中一个连接刚刚结束?

1 个答案:

答案 0 :(得分:2)

经过大量测试后,Redis似乎没有这样的功能。我也发现,扩展Socket.IO确实很痛苦。

所以我已经从Socket.IO切换到WS(参见this link)。它是低级别的(但对我来说很完美),它只支持WebSockets(在所有主要版本中)。但是我再一次只想支持WebSockets和FlashSocket(我必须手动复制,但这很好)。

优点是我可以轻松地使用此类服务​​器创建群集。 HAProxy几乎可以与这些服务器一起使用(一些小调整)。服务器可以在本地网络上轻松通信(如果群集很大,则使用UDP或中央TCP服务器)。

缺点是必须手动实现心跳,广播,房间等一些很酷的功能。此外,你想要长轮询后备,但在我的情况下这很好。缩放比较重要,imho。