2

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

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

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

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

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

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

但是,这些解决方案存在问题:

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

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

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

4

1 回答 1

2

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

所以我已经从 Socket.IO 切换到 WS(见这个链接)。它是低级的(但非常适合我的使用),它只支持 WebSockets(在所有主要版本中)。但话又说回来,我只想支持 WebSockets 和 FlashSocket(我必须手动实现,但这很好)。

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

缺点是必须手动实现一些很酷的功能,如心跳、广播、房间等。你也想要长轮询后备,但在我的情况下这很好。缩放仍然更重要,恕我直言。

于 2012-06-22T09:02:50.197 回答