部署新代码或热交换代码时保持套接字连接?
更新代码时是否可以维护套接字连接,或重新启动进程或热交换代码?
我正在考虑下一代正在处理的分布式服务器应用程序(目前用node.js编写),我希望只要服务器和远程客户端能够保持TCP套接字打开状态networking连接,即使在更新服务器代码或特定实例重新启动或消失时也是如此。
是否有以下可能?
- 代码重新启动之前,它将存储套接字信息,而远程端保持打开状态。 看来这在C中完全可行
- 代码重新启动之前,它将套接字信息发送到另一个实例或进程?
- 在Erlang的情况下,如果一个特定的代码被热交换,那么数据结构和连接是否不受干扰?
- 在一些元组空间分配套接字。 我对此一无所知,但至less听起来很有趣。
任何参考资料我应该看看? 在我看来,Erlang对于这个系统的未来版本来说是个不错的select,但是除了玩具的例子之外,我还没有使用它。
编辑:在Linux上运行
编辑:修复一个错字。
那么你没有提到它运行在哪个平台,所以我将假设Linux / Unix。 至less有两种方法可以做到这一点。
-
发送应用程序的信号,意思是“分叉和执行你的新自我”。 新的自我inheritance套接字。
-
你应该可以通过unix-pipes传递socket fds。 你可以有一些最小的pipe家应用程序,它会发送app-v1一个信号,将套接字转储到预定义的pipe道,完成后将其终止,然后启动app-v2并通过unix-pipe再次将套接字传递给套接字。
是的,Erlang可以根据新版本交换代码并转换内部状态数据结构。 简而言之:您必须实现转换函数,并在加载新版本的代码后同步调用它(不会丢失连接,但当然,您需要等待一下转换完成)。 这个特性在OTP中可靠地提供 (例如,如果你使用gen_server
你可以实现functioncode_change
)
两个想法摆脱了我的头顶,
-
用一个标准接口在一个单独的进程中实现套接字处理程序
-
用dll编译你的代码,这样你就可以在发生软件更新时加载和卸载实际的dll。