Node.js多服务器集群

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

我的问题是:在Node.js中可以使用这种分布式方法吗?

我已经阅读了关于“集群”模块,但是据我所知,它似乎只在同一台机器上的多处理器上扩展。

对的,这是可能的。

它不是NodeJS的一个属性,而是你为你的应用程序devise的架构,它将决定你是否可以做到这一点。

您的主要问题将始终是在您的实例中共享状态,所以假设您有4个聊天服务器ABCD,并且您有一个负载均衡器L,可以在4个服务器之间传播连接,那么当Aclosures时,您将所有A的连接重新连接到剩下的例子,你如何确保BC和D上的聊天室状态是一样的呢?

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

现在你最后的问题是LoadBalancer。 如果发生这种情况,整个系统就会closures。

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

我的build议是,你利用独立的集群分享国家。 换句话说,拥有一个API集群,服务器不会相互交谈,而是共享一个共同的Redis实例/集群,并共享一个共同的MongoDB集群。 这使您可以共享会话,variables,并且可以利用Redis的pub / subfunction来避免在API集群中需要任何闲话。

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