Node.js多服务器群集

Mas*_*ldo 19 distributed-computing node.js multiserver

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

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

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

小智 29

对的,这是可能的.

它不是NodeJS的属性,而是您为应用程序设计的架构,它将决定您是否可以执行此操作.

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

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

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

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


小智 5

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

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