如何优雅重启和停止
引言
为什么要优雅重启和停止 重启和停止有什么区别,怎么才能算是优雅的 信号量是什么东西,有哪些 如何实现优雅重启和停止 代码github
1、Why?
在开发阶段,我们修改完代码或者配置,会直接ctrl + c,然后启动服务,那么生产环境如果也是如此会造成什么问题?
请求丢失 用户行为被打断 你可能会失业
为了避免这种情况的发生,我们希望在应用更新或发布时,现有正在处理既有连接的应用不要中断,要先处理完既有连接后再退出。而新发布的应用在部署上去后再开始接收新的请求并进行处理,这样即可避免原来正在处理的连接被中断的问题
2、重启和停止的区别?
重启是指在应用更新时,并不希望正在处理的连接断掉,同时要有新的进程采用新的应用,并接受新的请求 停止是指在应用进程关闭时,可以处理完既有连接在关闭,并且停止接受新的连接 所谓优雅,底线就是不能丢失连接,把该处理的连接都要处理完
3、信号量的定义
信号是 Unix 、类 Unix 以及其他 POSIX 兼容的操作系统中进程间通讯的一种有限制的方式
常见信号量
命令信号描述ctrl + cSIGINT强制进程结束ctrl + zSIGTSTP任务中断,进程挂起ctrl + \SIGQUIT进程结束 和 dump core
全部信号量
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
复制代码
4、如何实现
实现目的
不关闭现有连接(正在运行中的程序)。 新的进程启动并替代旧进程。 新的进程接管新的连接。 连接要随时响应用户的请求。当用户仍在请求旧进程时要保持连接,新用户应请求新进程,不可以出现拒绝请求的情况。
实现原理
监听 SIGHUP 信号; 收到信号后将服务监听的文件描述符传递给新的子进程; 此时新老进程同时接收请求; 父进程停止接收新请求, 等待旧请求完成(或超时); 父进程退出.
采用第3方组件"github.com/fvbock/endless"
import ("github.com/fvbock/endless")
r := InitRouter()
s := &http.Server{
Addr: fmt.Sprintf("%s:%d", config.ServerSetting.HttpAddress, config.ServerSetting.HttpPort),
Handler: r,
ReadTimeout: config.ServerSetting.ReadTimeout, //请求响应的超市时间
WriteTimeout: config.ServerSetting.WriteTimeout, //返回响应的超时时间
//MaxHeaderBytes: 1 << 20,//默认的1MB
}
endless.ListenAndServe()
复制代码