在不关闭套接字的情况下重新启动实时node.js服务器?

时间:2016-08-16 18:15:12

标签: javascript node.js sockets pm2

我们有一小部分使用node.js的多人游戏服务器,目前在高峰使用期间每分钟服务大约100万条消息。有没有办法'优雅'重启服务器而不会导致套接字丢失?基本上,我想知道什么是处理重启的最佳方法,因为它通常对玩家来说非常具有破坏性?

2 个答案:

答案 0 :(得分:1)

使用redis或一些内存数据库存储连接,这样即使在服务器重启后也可轻松重新连接,而不会丢失任何会话或连接。如果它符合您的需要,请尝试这个。另请注意,在重新启动期间,连接可能会下降,但由于持久性,您将很容易再次连接。 socket.io-redis

答案 1 :(得分:1)

当进程退出时,操作系统会通过关闭它来清除属于它的任何套接字。因此,没有办法只进行简单的服务器重启并保留套接字连接。

在某些操作系统中,您可以将套接字的所有权从一个进程传递到另一个进程,因此在技术上可以创建临时进程或可能是以前存在的父进程),将套接字的所有权传递给其他进程。进程,重新启动服务器,然后将所有权转移回新启动的进程。我从来没有尝试过(或者听说过它已经完成了),但这听起来像是可行的。

这里有some information有关使用node.js中的child.send()将套接字转移到子进程的问题。看来只能对net模块创建的node.js套接字进行此操作,并且有一些注意事项,但这是可能的。

如果没有,通常的解决方法是让客户端在连接关闭时自动重新连接。正确完成后,这对客户端来说是相当透明的(除了服务器未运行的瞬间时间)。