在部署新代码或热交换代码时维护套接字连接?

时间:2012-10-10 23:44:39

标签: c node.js sockets erlang distributed-computing

更新代码或重启进程或热插拔代码时是否可以维护套接字连接?

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

以下任何一种可能吗?

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

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

编辑:在linux上运行

3 个答案:

答案 0 :(得分:3)

修改:修正拼写错误。

嗯,你没有提到它运行的平台,所以我将假设Linux / Unix。至少有两种方法可以做到这一点。

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

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

    < / LI>

答案 1 :(得分:1)

我的头脑中有两个想法,

  1. 使用标准接口

  2. 在单独的进程中实现套接字处理程序
  3. 在dll中编译代码,这样您就可以在软件更新发生时加载和卸载实际的dll。

答案 2 :(得分:1)

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