关于优雅停机,这是个看似简单,但实际应用中有很多细节需要考虑的功能。 大部分优雅停机只是实现了停掉 Tomcat 容器,停掉 Dubbo 服务,但实际上要停掉的可能不止这些。 比如用 @Scheduled 开启了定时任务,如果停机的时候恰好在执行任务怎么办?Elastic Job 实现的分布式任务同理。 比如 Kafka 或者用 Redis 实现的消费队列,消费到一半怎么办? 比如 Spring Cloud 这时有新的请求进来了怎么办,大部分上线脚本中,只会帮你把 Nginx 摘掉流量,但 Spring Cloud 这种流量没法帮你摘掉。等于流量没摘干净。 再比如 @Async 启动的异步线程池,Spring Event 异步事件线程池等,是不是要等待执行完成? 凡此种种。而且要做到关闭资源的先后顺序,比如不能停掉定时任务前关闭数据库资源。 只有做到彻底把项目变成没有代码运行的,与外界失联的孤岛,才真正是「优雅停机」的追求。 我们的实现可供参考:启动一个哨兵线程,哨兵中有可重入读写锁,在需要保护的任务前获取读锁,try/finally 中释放读锁。 哨兵线程监听 signal 信号,捕捉到信号后开始停机流程。第一步获取写锁,写锁会等待所有读锁释放。写锁成功取得后,开始关闭异步线程池、主动在 Eureka 下线(如果是 Spring Cloud),关掉 Dubbo 容器,关掉 Kafka 线程池。最后调用 Spring 容器的 shutdown,由 Spring 再去回收 bean 和资源关闭。 如果有更好的实现或建议,欢迎讨论。
展开
1
刘志国的头像
Java @ 成都小鸡叫叫
刘志国的头像
Java @ 成都小鸡叫叫
赞了这篇沸点
亲妈
娱乐小编于2019-02-25 07:56发布的图片
1
赞了这篇沸点
如何撬墙角 ​​​​
娱乐小编于2019-02-27 13:43发布的图片
12
赞了这篇沸点
灵魂一问
娱乐小编于2019-02-28 16:46发布的图片
12
赞了这篇沸点
天道好轮回,苍天饶过谁😂
李蚊子于2019-02-28 18:42发布的图片
8
刘志国的头像
关注了标签 GitHub GitHub
Java @ 成都小鸡叫叫
刘志国的头像
关注了标签 Redis Redis
Java @ 成都小鸡叫叫
刘志国的头像
关注了标签 Java Java
Java @ 成都小鸡叫叫
刘志国的头像
关注了标签 架构 架构
Java @ 成都小鸡叫叫
刘志国的头像
关注了标签 后端 后端
Java @ 成都小鸡叫叫
个人成就
文章被点赞273
文章被阅读16,896
掘力值441
收藏集
2
关注标签
6
加入于