如何扩展socket.io?

24
假设一个服务器通过socket.io处理10,000个并发连接。如果无法处理更多连接,则需要启动另一个服务器。如何使用它们的socket.io将这两个服务器进行同步?

我想知道你最终采用了什么方法。 - mvbl fst
你可能想看一下 https://github.com/topcloud/socketcluster - Jon
这个问题有任何新的更新吗? - MUHAMMAD SHAHID RAFI C P
2个回答

41

我不建议使用Cluster来扩展Socket.IO。Socket.IO 0.6被设计为单进程服务器,它使用长连接或轮询连接来实现服务器与客户端之间的实时连接。

如果你在Socket.IO客户端前面加上Cluster,你基本上会将轮询传输分配到不同的服务器上,这些服务器不知道客户端的存在。这将导致连接中断。但是,向所有客户端广播将会很麻烦,因为它们都分布在不同的服务器上,并且它们之间没有IPC。

所以,我只建议在仅使用Web Socket和Flash Socket连接且不需要使用广播功能时使用Cluster。

那么应该怎么做呢?

你可以等待Socket.IO 0.7发布,它是从头开始设计的,可以用于多个进程。

或者你可以使用发布/订阅来在不同的服务器之间发送消息。


1
这里有一个可用的RedisStore工作版本:https://github.com/dshaw/socket.io/blob/master/lib/stores/redis.js它很快也会在socket.io中提供,但如果您需要扩展,这可能是最快的方法。 - 3rdEden
2
是的,RedisStore。默认情况下,Socket.IO将握手和连接ID以及套接字数据存储在进程内存中,但当您切换到redis存储时,这些数据可在所有进程中使用,因为它们存储在一个单一的位置上,并且会复制全部进程的会话ID。因此,即使它们在不同的进程上握手,它们也可以接受每个传入的轮询。无论如何,完成的存储昨天已经落地在github主分支上,所以您可以在下一个版本中尝试它 :) - 3rdEden
@3rdEden,您是否有计划实现MongoStore版本?我觉得如果能够使用socket.set和socket.get方法就非常有趣 :) - jwchang
3
你可以使用我们在Socket.IO中提供的RedisStore https://github.com/LearnBoost/socket.io/blob/master/lib/stores/redis.js,这至少可以让你利用Node.js内置的集群功能跨多个进程扩展。 - 3rdEden
2
@3rdEden有更新你的答案的机会吗?看起来自那时以来发生了很多变化...谢谢! - cmcculloh
显示剩余8条评论

3
你可以尝试使用例如 cluster 模块,将负载分配到多个核心(如果您有多核CPU)。 如果这还不够,您可以尝试使用反向代理将请求分发到多个服务器,并使用redis作为中央会话数据存储(如果您的情况允许)。

1
适当编写的 cluster 代码应该能够通过一些样板代码在多个服务器上进行扩展。 - Raynos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接