[闪念]是后续新增的一个系列,把一些闪过自己脑海的念头记录下来,以便后面可以回顾和复盘。内容可能是引起共鸣或者触动的几句话,也可能是自己的些许感悟,都可以。以前,好多一闪而过的念头到后面记不起来,怪可惜的。好记性不如烂笔头,先记录下来再说。
最近,除了产品迭代需求之外,也对系统稳定性建设这块进行了诸多的梳理,主要从链路梳理、单点、资源、容量以及应急快反大块进行分类,然后细化到依赖优化、SQL治理、监控预警优化、代码重构、性能优化、成本优化,以及各种短板的补齐。
今天在做线程池这块梳理的时候,发现有一个系统使用了一个AsyncUtil工具类来完成线程池的操作,类似:
这样做的好处就是让我们很方便去操作一些异步化的操作。但是,同时有一个问题,不同业务的异步化任务会使用同一个线程池,没有相互隔离。如果某些场景导致线程池使用的堵塞,不同业务的任务会受影响。
一般,我们需要定义多个线程池来区分对待。
比如,我们定义两个线程池,一个专门用于记录操作日志,一个做其它的操作。
Configuration配置多个线程池
如:
@Async标注方法,同时指定线程池
这样,我们就完成了一个简单的线程池隔离的示例,不同场景,我们可以使用不同的线程池来处理。线程池一定要自己去定义,指定队列大小,防止异常发生导致OOM。
今天脑海中闪过Guava的EventBus,所以,也写了一个处理方法,记录一下:
定义线程池,模拟核心和非核心线程池
定义抽线的核心和非核心监听器
将核心监听器注器到核心EventBus上,非核心监听器注册到非核心EventBus上。如:
核心
非核心
定义具体的核心和非核心监听器
具体监听器中要做的事情,就是在doEventHandle中实现具体的操作即可。
核心
非核心
定义事件
模拟一个慢SQL事件
定义一个事件发送中心(非必要)
将核心和非核心线程池封装起来,提供postCoreEvent和postCommonEvent方法
至此,我们完成EventBus的线程池、监听器和事件定义,一个发布 / 订阅的示例就完成了。
接下来,我们就来使用它来模拟使用核心和非核心线程池发送慢SQL事件。
示例
//只要注入事件发布中心Component@Autowiredprivate EventBusPostCenter eventBusPostCenter;
//核心线程池使用eventBusPostCenter.postCoreEvent(event);
//非核心线程池使用eventBusPostCenter.postCommonEvent(event);
调用一下看下日志:
可以看到2个线程池都已成功处理。
本文是闪念记录的第一篇文章。主要是一些对异步化执行线程隔离的点滴记录。
写好上述EventBus的基础代码后,后续只要定义一个具体Event、以及具体的Lister实现doEventHandle()方法即可,也是很方便的。
当然,上述几种都是基于内存的线程池来完成的。如果对消息等丢失有要求啥的,还是要考虑分布式消息中间件等。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。