动态线程池框架 DynamicTp v1.1 版本发布


DynamicTp 简介

DynamicTp 是一个基于配置中心实现的轻量级动态线程池监控管理工具,主要功能可以总结为动态调参、通知报警、运行监控、三方包线程池管理等几大类。

经过多个版本的迭代,目前最新版本 v1.1.0 具有以下特性

  • 代码零侵入:我们改变了线程池以往的使用姿势,所有配置均放在配置中心,服务启动时会从配置中心拉取配置生成线程池对象放到 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 接口供用户自定义个性化实现(配置中心、配置文件解析、通知告警、监控数据采集、任务包装等等)

  • 线上大规模应用:参考美团线程池实践,美团内部已经有该理论成熟的应用经验

技术架构

v1.1.0 发布记录

Features

  • adapter 模块新增 motan rpc 框架线程池管理

  • adapter 模块新增 okhttp3 线程池管理

  • 新增 OrderedDtpExecutor,感谢 @hailang 提供实现

  • adapter 模块新增 brpc(starlight) 线程池管理

  • adapter 模块新增 tars rpc 线程池管理

  • 线程池配置添加 notifyEnabled 字段,可以全局控制通知功能开启与否

  • 新增 StreamRocketMqDtpAdapter,Rocketmq 线程池管理支持 Stream 场景下使用,感谢 @MIEAPP 提供实现

  • adapter 模块新增 sofa-rpc 框架线程池管理

  • 通过 SpringExecutor 支持 Spring 线程池

  • 支持飞书验签,感谢@ZhaoGZ 提供实现

BugFix

  • ApacheDubbo 线程池初始化失败问题修复,感谢 @hdgaadd 提供实现

  • SimpleTpProperties keepAliveTime 字段数据类型错误问题修复

Optimize

  • 要修改的核心线程数大于当前最大线程数不能修改问题优化

  • 引入 commons-collections,优化 hutool 高低版本不兼容问题

  • notify 模块相关代码重构

  • 采用 checkstyle 调整代码风格

项目地址

目前累计 3.2k star,感谢你的 star,欢迎 pr,业务之余一起给开源贡献一份力量

官网:https://dynamictp.cn

gitee 地址:https://gitee.com/dromara/dynamic-tp

github 地址:https://github.com/dromara/dynamic-tp


相關推薦

2023-03-30

DynamicTp 简介 DynamicTp 是一个基于配置中心实现的轻量级动态线程池监控管理工具,主要功能可以总结为动态调参、通知报警、运行监控、三方包线程池管理等几大类。 经过多个版本的迭代,目前最新版本 v1.1.2 具有以下特性

2022-11-08

DynamicTp 简介 DynamicTp 是一个基于配置中心实现的轻量级动态线程池监控管理工具,主要功能可以总结为动态调参、通知报警、运行监控、三方包线程池管理等几大类。 经过几个版本迭代,目前最新版本v1.0.9具有以下特性 特

2023-09-28

dynamic-tp v1.1.4 已经发布,轻量级动态线程池 此版本更新内容包括: Feature 支持 Spring 项目,SpringBoot 相关特性只在 starter 模块引入,@炼龙 添加 jvmti 黑科技模块,方便集成管理各种三方包线程池,@炼龙 升级 VariableLinke

2023-01-04

定 线程池 则使用 统一的线程池配置 如果通过 API 的方式动态更新了线程池 则使用动态更新 替换配置文件线程池配置 参见: ThreadPoolConfig thread-pool: core-pool-size: 1000 max-pool-size: 2000 自定义规则配置 如果开发者针对流程规则做

2023-06-04

类型就不会生成相应的代码,编译时候就会警告。 修复动态时候少一次磁盘访问。 https://github.com/hggq/paozhu C++ web框架特性 ✅ 1. 自带JSON编解码不用第三方库,标准JSON支持 ✅ 2. 支持多域名网站 ✅ 3. 支持多域名ssl 服务端 ✅ 4

2023-01-17

持了很多新的监控类型,MongoDB 数据库, ClickHouse 数据库 , DynamicTp线程池, RabbitMQ消息中间件, ActiveMQ消息中间件, Jetty AppServer. 修复若干BUG,完善了文档,重构了代码。快来体验下吧! 只需要一条docker命令即可安装体验heartbeat : dock

2022-12-25

生成二维码(qrcode),需要gd、qrencode库 ✅16. 插件化编程,热动态更新,使用动态库方式 https://github.com/hggq/paozhu  

2022-10-16

。一行代码开发一个分布式爬虫,拥有"多线程、异步、IP动态代理、分布式、JS渲染"等特性; 特性 1、简洁:API直观简洁,可快速上手; 2、轻量级:底层实现仅强依赖jsoup,简洁高效; 3、模块化:模块化的结构

2023-06-25

生成二维码(qrcode),需要gd、qrencode库 ✅16. 插件化编程,热动态更新,使用动态库方式 ✅17. 框架内置通用数据缓存模块,ORM结果缓存,提高并发能力 ✅18. 框架controller目录注解功能,方便添加URL路由映射,降低入门心智 ✅19. 结

2023-12-21

生成二维码(qrcode),需要gd、qrencode库 ✅16. 插件化编程,热动态更新,使用动态库方式 ✅17. 框架内置通用数据缓存模块,ORM结果缓存,提高并发能力 ✅18. 框架controller目录注解功能,方便添加URL路由映射,降低入门心智 ✅19. 结

2023-12-03

生成二维码(qrcode),需要gd、qrencode库 ✅16. 插件化编程,热动态更新,使用动态库方式 ✅17. 框架内置通用数据缓存模块,ORM结果缓存,提高并发能力 ✅18. 框架controller目录注解功能,方便添加URL路由映射,降低入门心智 ✅19. 结

2023-07-16

信息创建数据库表,可只创建部分 4. 支持 Spring boot 3.0, 动态配置 5. 完善 Sharding ThreadPool, 可以自定义配置 Sharding 操作执行线程数的大小 6. 完善 Android 多线程操作获取 SQLiteDatabase 的问题 使用实例: #1.解决缓存雪崩问题 #二级缓

2023-11-18

toJson()); } 可以在 ex­am­ple repo 查看更多信息。 动态 SQL 连接创建 默认情况下,连接池始终连接到同一主机,换句话说,数据库配置是静态的。有时数据库配置需要是动态的,例如连接到数据库阵列,或者数据库配置

2023-10-17

->指定任意节点先执行完则忽略其他。 推出EL表达式的动态组装API 之前LiteFlow推出过动态构建chain的API,类似于这样: LiteFlowChainELBuilder.createChain().setChainName("chain1").setEL( "THEN(a, b, WHEN(c, d))" ).build(); 但是EL表达式还是需要你