我的开源 2022,从 0 到 2.7k stars

21,301 阅读7分钟

简单来总结下动态线程池 DynamicTp 的 2022 年吧,DynamicTp 核心代码是我在 2022 年元旦那三天写的,当时为什么要写这个项目呢?

主要基于以下几点原因:

  1. 我之前也在美团待过,很早就知道内部有动态线程池这么一款工具

  2. 自己日常开发中,负责的服务无一例外都会用到线程池

  3. 用过线程池的都知道,那些核心参数是真的不好确定,需要做大量修改、发布、验证这套工作

  4. 线程池的运行对开发来说是个黑盒,运行情况不能及时感知,缺少监控告警功能

  5. 竟然大家都有这些痛点,为了更好的用好线程池,就打算搞个动态线程池的轮子方便自己,也方便他人

这就是当初为啥要写这个项目的大致原因了。

程序员不止需要完成工作上的 CRUD,也需要有一种发现痛点,解决痛点的魄力,虽然这听起来很枯燥,但投入其中会发现其实也挺有趣的。

写之前就确定了 DynamicTp 的实现思路及需要提供的功能。

  1. 要尽可能轻量,降低接入使用的复杂度,所以选择跟配置中心结合

  2. 需要有动态调整线程池参数的能力,基于配置中心的实时热更来完成

  3. 需要有监控功能,收集线程池运行过程中的各项指标,结合像 Prometheus+Grafana 这类监控工具来做可视化大盘

  4. 需要有通知告警功能,对拒绝任务数、队列使用率、执行超时任务数、线程池活跃度等达到配置的阈值时及时发出告警

  5. 适配常用第三方中间件的内部线程池,服务启动时拿到线程池对象交给 DynamicTp 来管理

整个项目也都是围绕这四个核心功能来展开的。

很多加我 vx 跟我聊天的小伙伴问的最多的问题就是想学习下项目,但是不知道从何入手。

其实我想说的是你要学习任何一个东西,一定先要去了解清楚它要解决的问题是什么?核心功能是什么?作者的思路一般也都是围绕着这些核心功能来展开做的,一步步完善成一个大工程的。核心功能肯定也不止一个,会有多个,你可以选择从一个你感兴趣的入手,看整个数据流、调用链路是怎样的,适当跳过一些细枝末节。这样看的多了慢慢就有感觉,就能串起来了。

也有一些小伙伴会咨询我说怎么做开源,其实开源这个东西大家千万别把它想的多高大上。跟你日常的业务开发也差不多,业务需求是产品提的,需要解决一类问题,一般是它驱的、有偿的。开源项目本质上来说也是需要解决一类问题,需求需要自己寻找,可以找自己日常开发中的一些痛点,是自驱的、用爱发电的。做开源就需要牺牲自己大量的业余时间,上班时间还是要认认真真做公司的事儿,像我一般都是周末或者晚上下班回家抽时间弄下开源的,带点热爱参与开源可能会走的更远。不要急功求成,做开源本身也是对自己的一种能力提升,项目火不火可以不用那么看重,相信是金子总会发光的。

DynamicTp 从去年一月开源到现在共收获了 2.8k 的 stars,740+forks,30+贡献者,600+群友,感谢一年来支持我们的人。

  1. 1 月项目开源,感谢@铂赛东,东哥在项目初期给我做了一波推广,项目 star 达到近 100

  2. 2 月美团动态线程池实践思路,开源了该篇文章在掘金平台火了,长时间霸榜第一,给了项目巨大的流量支持,项目总 star 数达到近 600,可能项目的很多关注者都是从掘金平台来的吧,这里非常感谢掘金平台给的机会

  3. 3 月发布第一个可用版本 1.0.2,3y 的 austin 项目也接入使用,功能特性持续贡献,感谢@Redick01,辉哥参与贡献了很多新特性

  4. 4 月项目将项目捐赠到了 Dromara 社区,为了更好的发展,基于社区来传播,让更多人接触到 DynamicTp

  5. 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年终总结征文大赛活动