1. 背景
一个系统会有许多的中间件组成,包括 RPC(Consumer&Producer),Http,Job,MQ(Consumer&Producer),当CI/CD流水线运行,实例机器被 下线时,如果Dubbo Consumer组件的线程组先被回收后,还可以继续不停消费业务消息,消费消息时会使用Dubbo Consumer组件去调用其他服务,此时 Dubbo Consumer的线程组已经被回收了,就会导致数据消费时异常。如果没有消费重试的机制,可以当这些下线时的消息丢失了。
2. 方案
首先收到kill -9 或是 kill -15 的信号后,
- 切断数据源头: Http, Dubbo, MQ consumer
- 不再提交新的任务 Job ThreadPool
- 等待 其他组件(Mq Sender,Rest Client,Dubbo Consumer,Transaction )的线程执行完成
3. API
# 可以添加Jvm自带的钩子方法
Runtime.addShutdownHook()
# 对于Spring容器的应用,可以监听close event 事件来,进行组件的优雅下线。