优雅停机的时机
1、执行 kill 前提前触发下线
理想状态下,所有服务可以暴露出来的一个下线接口,我们可以通过运维的自动化脚本提前执行下线,然后等待片刻,再执行 kill pid
遗憾的是,我们运维层面并没有做此规定,但有两个接口可以达到类似的效果
1、dubbo 的 qos 接口
2、spring boot actuator 的 shutdown 端点
spring boot actuator 我们很多应用都没接入,而且有局限性,我们暂不考虑
dubbo qos 接口现在大部分应用都支持,而且运维层面也已经支持,但默认情况下我们拿不到 qos 的 offline 事件,不过可以通过 qos offline功能增强 实现
2、jvm 钩子函数
如果我们没有提前对服务中的任务进行下线,也可以通过 jvm 钩子函数进行优雅关停,相关可参考 spring 优雅停机
任务的顺序编排
举个栗子
1、某个应用停机时先关闭了数据库连接,后关闭了 kafka 消费,导致停机时 kafka 消费的部分数据入库失败,造成数据丢失
因此,我们要梳理清楚服务中所有任务的依赖关系,然后手动编排停机顺序
因为不同业务的情况都不一样,下面只给出一个大概的编排顺序,实际情况请自行抉择
|
备注:dubbo 高版本默认的优雅停机也是通过 ContextClosedEvent 实现,如需要自己编排顺序,请阅读 dubbo优雅停机最佳实践和原理, 关于多个 ContextClosedEvent 顺序问题,请阅读 spring 优雅停机