简单来总结下动态线程池 DynamicTp 的 2022 年吧,DynamicTp 核心代码是我在 2022 年元旦那三天写的,当时为什么要写这个项目呢?
主要基于以下几点原因:
-
我之前也在美团待过,很早就知道内部有动态线程池这么一款工具
-
自己日常开发中,负责的服务无一例外都会用到线程池
-
用过线程池的都知道,那些核心参数是真的不好确定,需要做大量修改、发布、验证这套工作
-
线程池的运行对开发来说是个黑盒,运行情况不能及时感知,缺少监控告警功能
-
竟然大家都有这些痛点,为了更好的用好线程池,就打算搞个动态线程池的轮子方便自己,也方便他人
这就是当初为啥要写这个项目的大致原因了。
程序员不止需要完成工作上的 CRUD,也需要有一种发现痛点,解决痛点的魄力,虽然这听起来很枯燥,但投入其中会发现其实也挺有趣的。
写之前就确定了 DynamicTp 的实现思路及需要提供的功能。
-
要尽可能轻量,降低接入使用的复杂度,所以选择跟配置中心结合
-
需要有动态调整线程池参数的能力,基于配置中心的实时热更来完成
-
需要有监控功能,收集线程池运行过程中的各项指标,结合像 Prometheus+Grafana 这类监控工具来做可视化大盘
-
需要有通知告警功能,对拒绝任务数、队列使用率、执行超时任务数、线程池活跃度等达到配置的阈值时及时发出告警
-
适配常用第三方中间件的内部线程池,服务启动时拿到线程池对象交给 DynamicTp 来管理
整个项目也都是围绕这四个核心功能来展开的。
很多加我 vx 跟我聊天的小伙伴问的最多的问题就是想学习下项目,但是不知道从何入手。
其实我想说的是你要学习任何一个东西,一定先要去了解清楚它要解决的问题是什么?核心功能是什么?作者的思路一般也都是围绕着这些核心功能来展开做的,一步步完善成一个大工程的。核心功能肯定也不止一个,会有多个,你可以选择从一个你感兴趣的入手,看整个数据流、调用链路是怎样的,适当跳过一些细枝末节。这样看的多了慢慢就有感觉,就能串起来了。
也有一些小伙伴会咨询我说怎么做开源,其实开源这个东西大家千万别把它想的多高大上。跟你日常的业务开发也差不多,业务需求是产品提的,需要解决一类问题,一般是它驱的、有偿的。开源项目本质上来说也是需要解决一类问题,需求需要自己寻找,可以找自己日常开发中的一些痛点,是自驱的、用爱发电的。做开源就需要牺牲自己大量的业余时间,上班时间还是要认认真真做公司的事儿,像我一般都是周末或者晚上下班回家抽时间弄下开源的,带点热爱参与开源可能会走的更远。不要急功求成,做开源本身也是对自己的一种能力提升,项目火不火可以不用那么看重,相信是金子总会发光的。
DynamicTp 从去年一月开源到现在共收获了 2.8k 的 stars,740+forks,30+贡献者,600+群友,感谢一年来支持我们的人。
-
1 月项目开源,感谢@铂赛东,东哥在项目初期给我做了一波推广,项目 star 达到近 100
-
2 月美团动态线程池实践思路,开源了该篇文章在掘金平台火了,长时间霸榜第一,给了项目巨大的流量支持,项目总 star 数达到近 600,可能项目的很多关注者都是从掘金平台来的吧,这里非常感谢掘金平台给的机会
-
3 月发布第一个可用版本 1.0.2,3y 的 austin 项目也接入使用,功能特性持续贡献,感谢@Redick01,辉哥参与贡献了很多新特性
-
4 月项目将项目捐赠到了 Dromara 社区,为了更好的发展,基于社区来传播,让更多人接触到 DynamicTp
-
5 - 12 月,项目特性持续更新,更多小伙伴参与贡献,项目稳定性也越来越高,相继发布 1.0.8 里程碑版本及最新版本 1.0.9,年后预计发布 1.1.0 版本,适配了更多第三方中间件。非常感谢给 DynamicTp 贡献代码及 idea 的小伙伴们
也感谢那些自发帮 DynamicTp 推文的号主们,JavaGuide、Java3y、架构师社区、石衫的架构笔记、架构师成长指南、元人部落、涛歌依旧、java1234、苏三说技术、小哈学 java、java 学思等等。
经过多个版本的迭代,目前最新版本 v1.0.9 具有以下特性 ✅
-
代码零侵入:我们改变了线程池以往的使用姿势,所有配置均放在配置中心,服务启动时会从配置中心拉取配置生成线程池对象放到 Spring 容器中,使用时直接从 Spring 容器中获取,对业务代码零侵入
-
通知告警:提供多种报警维度(配置变更通知、活性报警、容量阈值报警、拒绝触发报警、任务执行或等待超时报警),已支持企业微信、钉钉、飞书、邮件报警,同时提供 SPI 接口可自定义扩展实现
-
运行监控:定时采集线程池指标数据,支持通过 MicroMeter、JsonLog 日志输出、Endpoint 三种方式,可通过 SPI 接口自定义扩展实现
-
任务增强:提供任务包装功能,实现 TaskWrapper 接口即可,如 MdcTaskWrapper、TtlTaskWrapper、SwTraceTaskWrapper,可以支持线程池上下文信息传递
-
多配置中心支持:基于主流配置中心实现线程池参数动态调整,实时生效,已支持 Nacos、Apollo、Zookeeper、Consul、Etcd,同时也提供 SPI 接口可自定义扩展实现
-
中间件线程池管理:集成管理常用第三方组件的线程池,已集成 Tomcat、Jetty、Undertow、Dubbo、RocketMq、Hystrix、Grpc、Motan、Okhttp3、Brpc、Tars、SofaRpc 等组件的线程池管理(调参、监控报警)
-
轻量简单:基于 SpringBoot 实现,引入 starter,接入只需简单 4 步就可完成,顺利 3 分钟搞定
-
多模式:参考 Tomcat 线程池提供了 IO 密集型场景使用的 EagerDtpExecutor 线程池
-
兼容性:JUC 普通线程池和 Spring 中的 ThreadPoolTaskExecutor 也可以被框架监控,@Bean 定义时加 @DynamicTp 注解即可
-
可靠性:框架提供的线程池实现 Spring 生命周期方法,可以在 Spring 容器关闭前尽可能多的处理队列中的任务
-
高可扩展:框架核心功能都提供 SPI 接口供用户自定义个性化实现(配置中心、配置文件解析、通知告警、监控数据采集、任务包装等等)
-
线上大规模应用:参考美团线程池实践,美团内部已经有该理论成熟的应用经验
最后,欢迎大家了解试用 DynamicTp。
官网:dynamictp.cn
gitee 地址:gitee.com/dromara/dyn…
github 地址:github.com/dromara/dyn…
「回顾2022,展望2023,我正在参与2022年终总结征文大赛活动」