本来计划做一次应用的部署升级,由单机模式,改为集群模式。但是在考虑方案时,遇到一个问题,如何在滚动升级时实现用户无感。
按照普通的逻辑,在滚动升级时,肯定是一台一台的进行升级部署,然后通过LB进行流量控制。这样用户时无感的,不会受升级的影响。
但是有一个问题就是,对于一台服务器进行升级时的“原子”操作,如何保证用户无感呢?应用关闭后,LB能够配置策略,自动感知并切换流量路径。
问题就出在应用关闭的那一瞬间,如果存在正在连接的用户(尤其是X系统,部分任务都是比较长时间的,比如执行费用清算,一个请求可能要跑几十个产品,如果此时直接停掉服务,则请求会被中断),如何保证已连接不被中断。
所以问题的核心就变成了应用如何优雅的进行退出。
这里我们需要分两种情况,一种是,如果SpringBoot的版本比较新(2.3及以上),则会比较简单,SpringBoot已经支持了Graceful shutdown的能力。
另一个情况,则是SpringBoot还使用的是老版本,或者没有使用SpringBoot,此时就需要自行进行处理了。
无论是哪种情况,在考虑如何进行优雅退出的时候,都需要面临几种场景:
1、用户连接都是耗时较小的,且都没有用到多线程来执行任务
此时,比较简单,参考此文章里面的方式进行shutdown即可。(不需要依赖SpringBoot的graceful shutdown能力)
通过文中的几种方式进行shutdown,基本上都能够正常的关闭请求中的连接。
但是,如果出现某个连接执行的时间比较长,且后续逻辑会用到spring container的功能,此时会报错。
因为,在Sp