部署新代码或热交换代码时保持套接字连接?

更新代码时是否可以维护套接字连接,或重新启动进程或热交换代码?

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

是否有以下可能?

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

任何参考资料我应该看看? 在我看来,Erlang对于这个系统的未来版本来说是个不错的select,但是除了玩具的例子之外,我还没有使用它。

编辑:在Linux上运行

编辑:修复一个错字。

那么你没有提到它运行在哪个平台,所以我将假设Linux / Unix。 至less有两种方法可以做到这一点。

  1. 发送应用程序的信号,意思是“分叉和执行你的新自我”。 新的自我inheritance套接字。

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

是的,Erlang可以根据新版本交换代码并转换内部状态数据结构。 简而言之:您必须实现转换函数,并在加载新版本的代码后同步调用它(不会丢失连接,但当然,您需要等待一下转换完成)​​。 这个特性在OTP中可靠地提供 (例如,如果你使用gen_server你可以实现functioncode_change

两个想法摆脱了我的头顶,

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

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