在不关闭套接字的情况下重新启动实时 node.js 服务器?
Restarting a realtime node.js server without closing sockets?
我们有一小部分使用 node.js 的多人游戏服务器,目前在使用高峰期每分钟处理大约 100 万条消息。有没有办法 'gracefully' 重新启动服务器而不导致套接字丢失?基本上,我想知道处理重启的最佳方式是什么,如果重启通常会对玩家造成很大的干扰吗?
使用 redis 或一些内存数据库来存储连接,这样即使在服务器重新启动后您也可以轻松地重新连接而不会丢失任何会话或连接。如果适合您的需要,请尝试此操作。另请注意,在重新启动期间连接可能会断开,但由于具有持久性,您将很容易再次连接。
socket.io-redis
当进程退出时,OS 通过关闭它们来清理属于它的所有套接字。所以,没有办法只做一个简单的服务器重启并保留你的套接字连接。
在某些操作系统中,您可以将套接字的所有权从一个进程传递给另一个进程,因此创建一个临时进程或可能是以前存在的父进程在技术上是可行的),将套接字的所有权传递给其他进程,重新启动您的服务器,然后将所有权转移回新启动的进程。我从未尝试过(或听说过这样做),但这听起来像是可行的。
这里 some information 使用 node.js 中的 child.send()
将套接字传输到子进程。看起来这只能针对 net
模块创建的 node.js 套接字完成,并且有一些关于这样做的警告,但这是可能的。
如果没有,通常的解决方法是让客户端在连接关闭时自动重新连接。如果做得好,这对客户端来说是相当透明的(除了服务器不在 运行 的瞬间)。
我们有一小部分使用 node.js 的多人游戏服务器,目前在使用高峰期每分钟处理大约 100 万条消息。有没有办法 'gracefully' 重新启动服务器而不导致套接字丢失?基本上,我想知道处理重启的最佳方式是什么,如果重启通常会对玩家造成很大的干扰吗?
使用 redis 或一些内存数据库来存储连接,这样即使在服务器重新启动后您也可以轻松地重新连接而不会丢失任何会话或连接。如果适合您的需要,请尝试此操作。另请注意,在重新启动期间连接可能会断开,但由于具有持久性,您将很容易再次连接。 socket.io-redis
当进程退出时,OS 通过关闭它们来清理属于它的所有套接字。所以,没有办法只做一个简单的服务器重启并保留你的套接字连接。
在某些操作系统中,您可以将套接字的所有权从一个进程传递给另一个进程,因此创建一个临时进程或可能是以前存在的父进程在技术上是可行的),将套接字的所有权传递给其他进程,重新启动您的服务器,然后将所有权转移回新启动的进程。我从未尝试过(或听说过这样做),但这听起来像是可行的。
这里 some information 使用 node.js 中的 child.send()
将套接字传输到子进程。看起来这只能针对 net
模块创建的 node.js 套接字完成,并且有一些关于这样做的警告,但这是可能的。
如果没有,通常的解决方法是让客户端在连接关闭时自动重新连接。如果做得好,这对客户端来说是相当透明的(除了服务器不在 运行 的瞬间)。