前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >异步化执行线程隔离的点滴记录 | 闪念N0.1

异步化执行线程隔离的点滴记录 | 闪念N0.1

作者头像
孟君
发布2023-03-08 19:56:30
3930
发布2023-03-08 19:56:30
举报

[闪念]是后续新增的一个系列,把一些闪过自己脑海的念头记录下来,以便后面可以回顾和复盘。内容可能是引起共鸣或者触动的几句话,也可能是自己的些许感悟,都可以。以前,好多一闪而过的念头到后面记不起来,怪可惜的。好记性不如烂笔头,先记录下来再说。

最近,除了产品迭代需求之外,也对系统稳定性建设这块进行了诸多的梳理,主要从链路梳理、单点、资源、容量以及应急快反大块进行分类,然后细化到依赖优化、SQL治理、监控预警优化、代码重构、性能优化、成本优化,以及各种短板的补齐。

今天在做线程池这块梳理的时候,发现有一个系统使用了一个AsyncUtil工具类来完成线程池的操作,类似:

图片
图片

这样做的好处就是让我们很方便去操作一些异步化的操作。但是,同时有一个问题,不同业务的异步化任务会使用同一个线程池,没有相互隔离。如果某些场景导致线程池使用的堵塞,不同业务的任务会受影响。

一般,我们需要定义多个线程池来区分对待。

结合@Async注解使用

比如,我们定义两个线程池,一个专门用于记录操作日志,一个做其它的操作。

Configuration配置多个线程池

如:

图片
图片

@Async标注方法,同时指定线程池

图片
图片

这样,我们就完成了一个简单的线程池隔离的示例,不同场景,我们可以使用不同的线程池来处理。线程池一定要自己去定义,指定队列大小,防止异常发生导致OOM

Guava EventBus来完成

今天脑海中闪过Guava的EventBus,所以,也写了一个处理方法,记录一下:

定义线程池,模拟核心和非核心线程池

图片
图片

定义抽线的核心和非核心监听器

将核心监听器注器到核心EventBus上,非核心监听器注册到非核心EventBus上。如:

核心

图片
图片

非核心

图片
图片

定义具体的核心和非核心监听器

具体监听器中要做的事情,就是在doEventHandle中实现具体的操作即可。

核心

图片
图片

非核心

图片
图片

定义事件

图片
图片

模拟一个慢SQL事件

图片
图片

定义一个事件发送中心(非必要)

将核心和非核心线程池封装起来,提供postCoreEventpostCommonEvent方法

图片
图片

至此,我们完成EventBus的线程池、监听器和事件定义,一个发布 / 订阅的示例就完成了。

接下来,我们就来使用它来模拟使用核心和非核心线程池发送慢SQL事件。

示例

代码语言:javascript
复制
//只要注入事件发布中心Component@Autowiredprivate EventBusPostCenter eventBusPostCenter;
//核心线程池使用eventBusPostCenter.postCoreEvent(event); 
//非核心线程池使用eventBusPostCenter.postCommonEvent(event); 
图片
图片

调用一下看下日志:

图片
图片

可以看到2个线程池都已成功处理。

小结

本文是闪念记录的第一篇文章。主要是一些对异步化执行线程隔离的点滴记录。

写好上述EventBus的基础代码后,后续只要定义一个具体Event、以及具体的Lister实现doEventHandle()方法即可,也是很方便的。

当然,上述几种都是基于内存的线程池来完成的。如果对消息等丢失有要求啥的,还是要考虑分布式消息中间件等。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结合@Async注解使用
  • Guava EventBus来完成
  • 小结
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档