Skip to main content Link Menu Expand (external link) Document Search Copy Copied

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 事件来,进行组件的优雅下线。

4. 参考文献