确认当前预估服务不支持优雅退出
当前light4j的版本是1.5.14
发现light4j从1.5.15开始支持graceful shutdown
https://github.com/networknt/light-4j/blob/master/server/src/main/java/com/networknt/server/Server.java
启动预估服务后,直接给java程序发SIGTERM信号,kill -SIGTERM JAVAPID,发现java程序能够优雅退出
但是通过RollingUpdate,发现java程序没有优雅退出
4.0 删除POD
4.1 POD进入Terminating状态
4.2 与此同时,k8s会将POD从对应的service删除
4.3 与此同时,有preStop hook的容器,会先执行preStop hook, 如果preStop hook的时间超出了Grace period,kubelet会发送SIGTERM
4.4 与此同时,没有preStop hook的容器,kubelet发送SIGTERM信号给启动进程
由于预估服务的镜像是通过bash script启动,而不是直接在Dockerfile里面执行java程序,由上面的知识可知,POD删除的时候,kubelet会发送SIGTERM信号给Bash Script进程。
现在会有一个问题,bash是不能传递信号的
所以需要在bash脚本里面捕获信号,并给java程序发SIGTERM信号
通过Bash Trap信号传递给JAVA进程后,发现RollingUpdate *** 作还是会有失败的请求,压测qps 500的时候,会有20个请求失败,表现为503, connect refuse
分析:
请求持续不断的过来,这个时候进程收到了SIGTERM信号后开始处理没有完成的请求,但是在切流量的过程中,就是kubelet发送SIGTERM信号和把POD从service拿掉的过程中,有一点请求漏过来了
所以需要确保切流量之后,进程收到SIGTERM之前,不要有流量进来。
加上lifecycle preStop
再次测试,RollingUpdate几次,发现没有失败的请求了
我的经验是邮件形式提交简单的书面辞职信,然后老板会找你约谈。因为,约老板面谈直接说,“老板我要辞职了。”其实很尴尬。老板没有缓冲时间和心理准备。最好在周五下班提交辞职信,老板会在周末有个思想缓冲,想清楚交接安排和人员安排,那么下周就可以和你面谈,且经过两个休息日,即便有不爽的情绪,也基本上都稀释掉了。彼此都回归理性后,离职谈话会更加轻松。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)