0

更新代码时是否可以保持套接字连接,或者重新启动进程或热插拔代码?

我正在考虑我正在开发的下一代分布式服务器应用程序(目前用 node.js 编写),我希望能够保持 tcp 套接字打开,只要服务器和远程客户端有网络连接,即使服务器代码更新或特定实例重新启动或消失。

以下是否有可能?

  • 在代码重新启动之前,它会存储套接字信息,而远程端保持打开状态。似乎这在 C 中是完全可行的。
  • 在代码重新启动之前,它会将套接字信息发送到另一个实例或进程吗?
  • 在 Erlang 的情况下,如果一段特定的代码被热交换,数据结构和连接不会受到干扰吗?
  • 在一些元组空间中分配套接字。我对此一无所知,但至少听起来很有趣。

有什么我应该看的参考资料吗?在我看来,Erlang 是该系统未来版本的一个很好的候选者,但除了玩具示例之外,我没有将它用于任何其他用途。

编辑:在linux上运行

4

3 回答 3

3

编辑:修正一个错字。

好吧,你没有提到它在哪个平台上运行,所以我假设是 Linux/Unix。至少有两种方法可以做到这一点。

  1. 向应用程序发送一个信号,意思是“分叉并执行你的新自我”。新的自我继承了套接字。

  2. 您应该能够通过 unix-pipes 传递套接字 fds。您可以拥有一些最小的管家应用程序,它将向 app-v1 发送信号以将套接字转储到预定义的管道,完成后将其终止,然后启动 app-v2 并通过 unix-pipe 再次将套接字传递给它。

于 2012-10-11T01:39:11.657 回答
1

是的,在 Erlang 中可以根据新版本交换代码和转换内部状态数据结构。一句话:你必须实现transform函数,并且在加载新版本代码后同步调用它(你不会失去连接,但是你需要等待一段时间才能完成transformation)。OTP中可靠地提供了此功能(例如,如果您正在使用,则可以实现 function )gen_servercode_change

于 2012-10-11T08:08:28.873 回答
1

脑子里冒出两个念头,

  1. 使用标准接口在单独的进程中实现套接字处理程序

  2. 在 dll 中编译您的代码,这样您就可以在软件更新发生时加载和卸载实际的 dll。

于 2012-10-10T23:50:18.043 回答