在 Node.js 服务器重新启动时保持 WebSocket 连接是否可能?

8
使用任何技巧,是否可以在重新启动Node.js服务器时保持websocket连接?
1个回答

12
不直接。按设计,当一个进程关闭时,操作系统会清理该进程拥有的所有资源。这就是操作系统防止随着进程启动和关闭而导致资源泄漏的方式。所以,当你的服务器进程关闭时,任何仍然打开的套接字都将被操作系统关闭。
通常的解决方案是编写客户端代码,如果客户端在没有意图断开连接的情况下失去了WebSocket连接,则自动重新连接。socket.io(位于WebSocket之上的一层)内置了此类自动重新连接行为,正是出于这个原因。
如果您在服务器前面放置代理,配置为客户端连接代理,然后代理连接到您的服务器,那么可能可以教导代理以一种客户端不知道发生任何事情的方式自动重新连接服务器(只要他们没有尝试在服务器关闭时发送消息)。当然,这样您将面临代理重启的问题。
在某些操作系统中,可能会将TCP套接字的所有权从同一主机上的一个进程转移到另一个进程。因此,我可以构想一种方案(我还没有尝试过),其中您可以启动一个临时进程,将您的服务器中的所有WebSocket套接字传输到这个临时进程中,然后重新启动您的服务器,在新的服务器实例启动后,将套接字传输回来,然后杀死临时进程。
由于WebSocket可能因多种其他原因意外断开连接,我认为客户端重新连接是一个解决方案,可以覆盖服务器重启和您的系统中可能发生的许多其他潜在问题,并且已经编写了代码来处理这些问题。

我已经添加了重新连接的代码,但用户体验并不好。同时,当客户端开始重新连接时,服务器的CPU使用率和带宽也会增加。 - Chintan
@Chintan - 不清楚为什么重新连接会导致客户端体验更糟。您的服务器将在一段时间内关闭,因此在重新启动期间所有客户端基本上都处于离线状态。除非您开始使用多个服务器并且其他人在重启期间在线,否则无法解决这个问题。是的,重新连接需要更多的服务器CPU,但应该是非常短暂的,然后恢复正常。 - jfriend00
我也想达到同样的目标,但问题在于例如有“100000个客户端”正在重新连接,一旦服务器启动,每个人都试图连接,并且在每个连接上,我们有3-4个“mongo i/o操作”,这会使我们的“mongo”变得拥挤,因为mongo无法处理如此多的并行请求。有没有办法可以避免服务器重新启动时客户端的重新连接? - Saif Ali Khan
@SaifAliKhan - 我建议您提出自己的问题,并填写更多关于您特定情况的细节。那个主题与最初提出的问题并不完全相同,讨论您的问题也不适合在这里的评论中进行。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接