Node.js多服务器群集

时间:2013-03-19 14:18:37

标签: node.js distributed-computing multiserver

我正在开发一个涉及服务器的Node.js项目(为了简单起见,我们将这个服务器想象成一个必须将消息从某些客户端转发到其他客户端的聊天服务器)。我需要QoS原因,这个服务器总是可以访问的,所以我想使用集群来划分不同服务器(不同的物理机器)之间的平衡负载,并确保如果服务器出现故障,另一个服务器将准备好服务请求。

我的问题是:在Node.js中这种分布式方法是否可行?

我已经阅读过关于“集群”模块的内容,但是,根据我的理解,它似乎只能在同一台机器上的多处理器上进行扩展。

2 个答案:

答案 0 :(得分:29)

是的,这是可能的。

它不是NodeJS的属性,而是您为应用程序设计的架构,它将决定您是否可以这样做。

你的主要问题始终是在你的实例之间共享状态,所以说你有4个聊天服务器ABCD,你有一个LoadBalancer L在4个服务器上传播连接,然后当A关闭时,你重新连接所有A的连接到剩余的实例,你如何确保聊天室的状态在BC和D上是相同的?

一种方法是让应用程序代码完全无状态,并将所有数据推送到分布式内存数据库,如mongoDb或Redis。您希望在其中一个数据库实例关闭时分发数据库。

现在你最后一个问题是LoadBalancer。如果这种情况发生,那么整个系统都会崩溃。

所以长话短说;是的,你可以做到,但你需要做出一些艰难的决定,确定潜在的失败点。如果您不想要单点故障,那么您将需要一个复杂而昂贵的设置。

答案 1 :(得分:5)

我的建议是您利用独立群集来共享状态。换句话说,拥有一个API集群,其中服务器不会相互通信,而是共享一个共同的Redis实例/集群,并共享一个共同的MongoDB集群。这允许您共享会话,变量,并且您可以利用Redis的pub / sub功能来避免在API群集中需要任何闲聊。

对于聊天,如果你使用Redis和Socket.IO作为你的客户端,那么每当你向大厅广播时,它会在幕后使用redis将该消息广播到那个大厅,尽管大厅成员存在于多个服务器上。此外,这会创建另一级别的容错,因为任何服务器都可以管理套接字重新连接,如果连接断开,socket.io将自动重新连接到API集群,同时通过Redis维护状态。