长连接平滑重启实现

---------------------------------------------------------------------------------------------
                     old process                         new process
send upgrade signal ---> |                                    |
                         |    ----------- fork ----------->   |
                         |                                    | start listen and init finish
                         |    <- send init finish signal --   |
         close listening |                                    |
                         |    send connection state data ->   |
                         |                                    | accept and init finish
                         |    <---- send finish signal ----   |
                    exit |                                    |
---------------------------------------------------------------------------------------------
Use a domain socket to transfer connection state data

实现原理

1. 进程每次启动时必须check有无继承socket(尝试连接本地的unix server,如果连接失败,说明是第一次启动,否则可能有继承的socket),如果有,就将socket加入到自己的连接池中。

2. 旧进程监听USR2信号,监听后动作:
    1) 监听Unix socket。
    2) 使用旧进程启动的命令fork一个子进程(发布到线上的新二进制)。
    3) accept到新进程的请求,关闭旧进程listener(保证旧进程不会再有新请求,同时所有connector不在read/writer socket。
    4) 旧进程将现有连接的socket,以及连接状态(读写buffer,connect session)通过 unix socket发送到新进程。
    5) 最后旧进程给新进程发送发送完毕信号,随后退出
实际生产中,迁移连接这一步需要考虑的细节非常多,且可能出现新进程被自己的请求打死的情况,demo中粗略实现了上述逻辑。

Demo

Code Demo

猜你喜欢

转载自www.cnblogs.com/wuwangchuxin0924/p/12010226.html