码迷,mamicode.com
首页 > 其他好文 > 详细

长连接平滑重启实现

时间:2019-12-09 13:57:31      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:dom   失败   exit   否则   ESS   close   重启   tps   check   

---------------------------------------------------------------------------------------------
                     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

长连接平滑重启实现

标签:dom   失败   exit   否则   ESS   close   重启   tps   check   

原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/12010226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!