跳转至
阅读量:

服务热重载实现思路

热重启(平滑重启、热修复)是指在不中断已有请求的状态下对服务进行重启。例如 nginx 在不断开连接的情况下重新加载新配置,微服务在不断业务的情况下完成热升级,这些都是热重启的一些应用。

在 Linux 服务器上实现热重启主要有以下两种方式:覆盖模式管理者模式

覆盖模式

该模式下,父进程会 fork 出子进程,将自身占有的文件资源交给子进程,子进程创建完成后通知父进程退出并开始接收新的连接,父进程收到通知后就不再接收新的连接,将当前连接处理完成后父进程就会退出,子进程此时就代替了父进程成为新的服务程序。流程图如下所示:

image-20220301182856643

管理者模式

在管理者模式下,服务进程是管理进程的子进程,当收到热重启信号时,控制进程会通知当前服务进程退出,当前服务进程会处理当前未处理完的连接,处理完成后进程退出。控制进程会新建一个子进程,子进程会来处理新的连接。

image-20220301184843478

总结

两种模式都能够实现热重启,但是两种模式会有一定的差异。第一种方式下重载后进程 PID 会发生改变,第二种有无父进程未销毁因此 PID 不会发生修改。

相较而言,第一种方式更适合单服务的情况,第二种更适合多服务的情况。

评论