程序的无缝重启

程序的无缝重启

主要适用场景为短连接,对于长连接的情况,适用的场景比较有限。

程序的无缝重启是对于 Client 透明的一种重启方案,即保证原有连接客户端的业务逻辑正常,同时启动一个新的进程用于处理后续的新连接的 Client 的处理。

无缝重启的核心点在于需要将原有服务端程序的 listenfd 复制到后启动的服务端程序中, Linux的 Fork 原语非常好的适合此种场景,因为Fork 采用 Copy-on-Write的技术,子进程直接共享了父进程的各种资源。

参考上图中的逻辑,parent process为已经运行的服务端程序,child process则为重启后接替parent process进程新进程。大体实现方式如下:
1. 首先定义重启信号或者标志位,触发重启流程。由于程序已经服务了 Client A...X, 所以其仍然要存在一段时间直至A....X的业务处理完毕;
2. 在重启流程中将父进程的 listenfd 通过Fork技术传递到 子进程中,由于设置了特殊的标志,子进程启动后能够明确自己的角色,在listenfd 上进行 accept 新连接的 client B....Y;
3. 待parent process进程处理完毕 Client A...X后,退出
4. child process的全局接管。

参考资料:

程序的无缝重启》上有1条评论

  1. Pingback引用通告: go1.8 http graceful shutdown example | 程序印象

发表评论

电子邮件地址不会被公开。 必填项已用*标注