Node.js& Socket.io具有高可用性

时间:2015-01-12 05:42:18

标签: node.js socket.io high-availability

我们有一个node.js服务器,主要用于socket.io,用于Web应用程序中的浏览器互连。

我们希望拥有一个高可用性解决方案,理论上它包含两个node.js服务器,一个作为主服务器,另一个作为备用,如果主要服务器失败。该解决方案将允许在主节点.js服务器发生故障时,备份将接管以提供无缝功能而不会中断。

是否有一个解决方案允许socket.io在多个服务器上维护客户端连接数组,而不会复制客户端或发送的消息?

我们应该考虑HA和node.js的其他范例吗?

2 个答案:

答案 0 :(得分:4)

当新服务器当前连接的服务器发生故障时,无法在没有任何中断的情况下进行webSocket自动故障转移。连接到服务器的webSockets将会死机。这就是TCP套接字的工作方式。

幸运的是,对于socket.io,客户端将很快意识到连接已丢失(在几秒钟内),客户端将尝试相当快速地重新连接。如果您的备份服务器立即就位(例如热备用)来处理传入的socket.io连接,那么从客户端的角度来看,重新连接将是相当无缝的。从客户的角度来看,它似乎只是暂时的网络中断。

但是,在服务器上,您不仅需要备份,还必须能够恢复每个连接的任何状态。如果连接只是用于传递通知的管道并且是无状态的,那么这很容易,因为接收重新连接的备份服务器将立即开始运营。

如果您的socket.io连接在服务器端是有状态的,那么当备份服务器接管时,您将需要一种方法来恢复/访问该状态。一种方法是将状态保存在与Web服务器分开的redis服务器中(尽管您还需要redis服务器的备份/高可用性计划)。

答案 1 :(得分:1)

主服务器和备份服务器中的SocketIO可以连接到redis服务器。这将维护主服务器中的会话并可供备份服务器使用,客户端应再次连接到新服务器(主要服务器失败时)。

SoketIO- Redis

HA - 代理用于多个node.js实例之间的负载平衡。 HA代理的使用将取决于您将如何处理主服务器的故障。如果您有任何方法可以自动切换主服务器,那么HA代理将没有多大用处,否则您可以配置HA-Proxy以在主服务器无法访问时将请求转发到备份服务器。

与HA-Proxy类似的其他选项包括:

node-http-proxy

Nginx