我正在与Node.js合作一个涉及服务器的项目(为了简单起见,让我们将这个服务器想象成一个聊天服务器,它必须将消息从某些客户端转发到其他客户端)。出于QoS的原因,我需要此服务器始终可访问,因此我考虑使用集群在不同的服务器(不同的物理机)之间分配平衡负载,并确保如果一台服务器宕机,另一台服务器将准备好为请求提供服务。
我的问题是:这种分布式方法在Node.js中可行吗?
我已经读到过“集群”模块,但据我所知,它似乎只能在同一台机器上的多处理器上进行扩展。
发布于 2013-03-19 22:45:06
是的,这是可能的。
它不是NodeJS的属性,而是您为应用程序设计的体系结构,它将决定您是否能做到这一点。
您的主要问题始终是在实例之间共享状态,因此假设您有4个聊天服务器A、B、C、D,并且您有一个LoadBalancer L,它将连接分散到这4个服务器上,那么当A宕机时,您将所有A的连接重新连接到其余实例,如何确保聊天室在B、C和D上的状态相同?
一种方法是让应用程序代码完全无状态,并将所有数据推送到分布式内存数据库,如mongoDb或Redis。您希望在其中一个数据库实例宕机的情况下分发数据库。
现在您的最后一个问题是LoadBalancer。如果它崩溃了,你的整个系统就会崩溃。
所以长话短说;是的,你可以做到,但你需要做出一些艰难的决定,决定你的潜在故障点在哪里。如果您希望没有单点故障,那么您将需要一个复杂且昂贵的设置。
发布于 2013-07-05 08:48:45
我的建议是利用独立的集群来共享状态。换句话说,有一个API集群,其中的服务器不相互通信,而是共享一个公共的Redis实例/集群,并共享一个公共的MongoDB集群。这允许您共享会话、变量,并且您可以利用Redis的发布/订阅功能来避免在您的API集群中进行任何八卦。
特别是对于聊天,如果你使用Redis和Socket.IO作为你的客户端,那么无论你何时广播到一个大厅,它都会在后台使用redis将消息广播到那个大厅,尽管大厅成员存在于多个服务器上。此外,这创建了另一个级别的容错,因为任何服务器都可以管理套接字重新连接,如果连接中断,socket.io将自动重新连接到API集群,同时通过Redis维护状态。
https://stackoverflow.com/questions/15501997
复制相似问题