所以,我读过有关缩放Socket.IO一些文章。 由于种种原因,我不希望使用内置的Socket.IO缩放机制(主要是它似乎是低效的,因为它发布了很多东西的Redis然后从我的角度来看需要)。
所以我想出了这个简单的想法:
每个Socket.IO服务器创建的Redis的pub / sub /存储的客户端,连接到Redis的和订阅的频道。 现在,当我想广播数据我只是将它发布到Redis的和所有其他Socket.IO服务器得到它,并将它推给用户。
这里有一个问题,但(我认为也是Socket.IO内置的机制有问题)。 比方说,我想知道的所有连接的用户数量。 有这样做的至少有两种方法:
服务器A发布
give_me_clients
到Redis的。 然后,每个Socket.IO服务器的连接数和出版number_of_clients
。 服务器A抓住这个数据,结合它,并将其发送给客户端。每个服务器更新
number_of_clients_for::ID_HERE
每当用户连接/在Redis的断开服务器。 然后,服务器A只是获取数据,并结合了。 可能是更有效的。
有这些解决方案虽然问题:
服务器A不知道其他的服务器。 因此,他不知道他什么时候应该停止听
number_of_clients
。 人们可以用做服务器A知道其他服务器的修复:每当服务器连接到Redis的他发表new_server
(服务器A抓住内存中的数据并将其存储)。 但是做什么,当Redis的 - Socket.IO连接中断? 是否有Redis的通知客户,该客户端的一个断开的方式吗?其实与上面相同。 当Socket.IO服务器崩溃如何清除
number_of_clients
数据?
所以真正的问题是:可以Redis的通知(发布到CHANEL)的客户,与他们的一个连接刚刚结束?