具有高可用性的Node.js和Socket.io

tan*_*rwj 2 high-availability node.js socket.io

我们有一个node.js服务器,该服务器主要与socket.io一起使用,以在Web应用程序中实现浏览器相互连接。

我们希望有一个高可用性解决方案,该解决方案理论上将由两台node.js服务器组成,一台作为主服务器,另一台作为备用服务器(如果主服务器发生故障)。该解决方案将允许在主node.js服务器停机时或当主服务器停机时,备份将接管提供无缝功能而不会中断。

有没有一种解决方案可以使socket.io维护多个服务器上的客户端连接阵列,而无需重复客户端或发送的消息?

对于HA和node.js,我们应该考虑另一个范式吗?

jfr*_*d00 5

当当前连接的新服务器发生故障时,无法进行webSocket自动故障转移而不中断新服务器。连接到发生故障的服务器的webSocket将消失。这就是TCP套接字的工作方式。

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

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

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