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

2019-09-18 07:35发布

所以,我读过有关缩放Socket.IO一些文章。 由于种种原因,我不希望使用内置的Socket.IO缩放机制(主要是它似乎是低效的,因为它发布了很多东西的Redis然后从我的角度来看需要)。

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

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

这里有一个问题,但(我认为也是Socket.IO内置的机制有问题)。 比方说,我想知道的所有连接的用户数量。 有这样做的至少有两种方法:

  1. 服务器A发布give_me_clients到Redis的。 然后,每个Socket.IO服务器的连接数和出版number_of_clients 。 服务器A抓住这个数据,结合它,并将其发送给客户端。

  2. 每个服务器更新number_of_clients_for::ID_HERE每当用户连接/在Redis的断开服务器。 然后,服务器A只是获取数据,并结合了。 可能是更有效的。

有这些解决方案虽然问题:

  1. 服务器A不知道其他的服务器。 因此,他不知道他什么时候应该停止听number_of_clients 。 人们可以用做服务器A知道其他服务器的修复:每当服务器连接到Redis的他发表new_server (服务器A抓住内存中的数据并将其存储)。 但是做什么,当Redis的 - Socket.IO连接中断? 是否有Redis的通知客户,该客户端的一个断开的方式吗?

  2. 其实与上面相同。 当Socket.IO服务器崩溃如何清除number_of_clients数据?

所以真正的问题是:可以Redis的通知(发布到CHANEL)的客户,与他们的一个连接刚刚结束?

Answer 1:

经过大量测试它似乎,那Redis的不具备这样的功能。 此外,我已经找到了,那缩放Socket.IO是一个真正的痛苦。

所以,我从Socket.IO切换到WS(见这个链接 )。 它是低电平(但适合我的使用),它仅支持WebSockets的(在所有主要版本)。 但是,有一次我只是想支持的WebSockets和FlashSocket(我必须手动imlement,但这是罚款)。

其优点是,我可以轻松地创建这样的服务器集群。 HAProxy的作品有这样的服务器几乎开箱(一些小的调整)。 服务器可以在本地网络很容易沟通(与UDP或TCP中央服务器群集是否大)。

缺点是一个必须手动执行一些很酷的功能,如心跳,广播,房间等你也想拥有长轮询回落,但是这在我的情况很好。 缩放仍然是比较重要的,恕我直言。



文章来源: Redis clients broadcast problems (in the context of Socket.IO)