【问题标题】:Restarting a realtime node.js server without closing sockets?在不关闭套接字的情况下重新启动实时 node.js 服务器?
【发布时间】:2016-08-17 05:06:28
【问题描述】:

我们有一小部分使用 node.js 的多人游戏服务器,目前在高峰使用期间每分钟提供大约 100 万条消息。有没有办法“优雅地”重新启动服务器而不会导致套接字丢失?基本上,我想知道处理重启的最佳方式是什么,如果这通常会对玩家造成很大的破坏?

【问题讨论】:

  • 我不认为你可以用 pm2 做到这一点。它确实具有“热重载”功能,但仅当您的服务器不维护任何长时间运行的打开连接(如(网络)套接字)时才有效。 pm2手册特别提到了这个here。

标签: javascript node.js sockets pm2


【解决方案1】:

当一个进程退出时,操作系统通过关闭它们来清理属于它的所有套接字。所以,没有办法只做一个简单的服务器重启并保留你的套接字连接。

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

这是 some information 在 node.js 中使用 child.send() 将套接字传输到子进程的内容。看来这只能对net 模块创建的node.js 套接字执行,并且有一些注意事项,但这是可能的。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 2023-03-21
      • 2012-10-03
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 2018-01-07
      • 2011-07-21
      相关资源
      最近更新 更多