# 《并发设计模式》第16章-两阶段终止模式-实现监控报警系统线程优雅退出
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
- 本章难度:★★☆☆☆
- 本章重点:基于两阶段终止模式优先监控报警系统,实现监控报警系统上报告警信息线程的优雅退出,实现上报告警信息退出之前,执行完对应的上报告警信息的任务,并能够结合自身项目实际场景思考如何将两阶段终止模式灵活应用到自身实际项目中。
大家好,我是冰河~~
两阶段终止模式会分为准备阶段和执行阶段,准备阶段就是通知目标线程准备停止,这一阶段主要是设置一个标志变量指示目标线程可以准备停止了。而执行阶段则是检查准备阶段设置的线程停止标识和信号,在此基础上确定线程停止的时机,并适当进行一定的“清理”工作。那么,在实际项目中,改如何应用两阶段终止模式呢?
# 一、故事背景
小菜在开发监控报警中,上报告警信息功能时,经常出现告警信息还没处理完,上报告警信息的线程就已经退出的问题。但是,小菜开始根本不知道问题出在哪里,导致花费了大量的时间来排查和定位问题,尽管如此,但还是没能找到问题所在。后来,小菜寻求了老王的帮助,在老王的分析和指导下,小菜采用临时方案解决了问题,但这还不是最优的方案。
在老王的指导下,小菜知道了要想让监控报警系统中,上报告警信息的线程执行完任务之后再退出,最佳的解决方案就是使用两阶段终止模式。同样,经过老王的耐心指导,小菜也明白了到底什么是两阶段终止模式。
但现在摆在小菜面前的还有一个非常重要的问题:那就是如何基于两阶段终止模式优化监控报警系统,使上报监控告警信息的线程,执行完任务后再优雅的退出。
为此,小菜下班回到家,可没少花时间思考这个问题,但思考来思考下,还是不知道从哪里下手实现,究其根本原因就是小菜根本不知道如何在实际项目中使用两阶段终止模式。
直到深夜,小菜实在是没招了,心里郁闷的想:哎,实在是不知道怎么做了,明天还是去请教老大吧。
就这样,小菜关上了电脑,去洗漱,准备睡觉了。。。
# 二、探明情况
时间来到第二天,小菜又是早早的来到了公司,坐到自己的工位上,认真思考着如何将两阶段终止模式应用到监控报警系统中。此时,听到身后一个熟悉的声音:“小菜,来这么早啊”。小菜回过头来一看,原来是老王到公司了,“老大,早啊”。
“早,小菜,知道怎么将两阶段终止模式应用到监控报警系统中了吗?”,老王随口问到。
“额,这个确实还不太清楚,昨天我下班回到家搞到很晚,也没啥头绪,刚才还在想这个问题”,小菜回应到。
“好吧,走,去会议室,我给你讲讲”,老王继续说。
“好的”。
于是,二人一起拿着电脑走进了会议室,老王为小菜耐心的讲解起了如何基于两阶段终止模式优化监控报警系统,使上报监控信息的线程执行完任务后再优雅退出。。。
# 三、优化监控
在原有的报警系统中,主要由报警管理器来上报告警信息,如图16-1所示。
我们可以基于报警管理器引入报警发送器来并发上报报警信息,优化报警管理器上报告警信息的性能,如图16-2所示。
可以看到,在报警管理器中,引入报警发送器后,就能够利用多个报警发送器来并行上报告警信息,提高了上报告警信息的性能。其实,这里的报警发送器就是报警管理器中的线程,也就是说,报警发送器其实就是一个个上报告警信息的线程。报警管理器和报警发送器的关系就有点类似于操作系统中的进程和线程的关系,报警管理器就类似于操作系统中的进程,报警发送器就类似于操作系统中的线程,一个报警管理器中可以包含多个报警发送器。最终,会由报警管理器中的报警发送器上报告警信息。
搞清楚监控报警系统的大体执行流程后,就比较清楚基于两阶段终止模式优化哪部分流程了,其实就是要 基于两阶段终止模式优化报警发送器线程的退出流程,使其能够执行完任务后优雅的退出。
如果不使用两阶段终止模式优化报警发送器线程的退出流程,就可能导致当前报警发送器线程还没执行完任务,就已经退出的问题,这就会造成任务的丢失,可能会导致一些重要的监控报警信息没有被上传到报警监控大盘,如图16-3所示。
# 查看全文
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码