Home

Awesome

<p align="center"> <img alt="logo" src="resources/img/logo.png" width="50%"> </p> <p align="center"> <strong>基于配置中心的轻量级动态线程池,内置监控告警功能,集成常用中间件线程池管理,可通过SPI自定义扩展实现</strong> </p> <p align="center"> <a href="https://gitee.com/dromara/dynamic-tp"><img src="https://gitee.com/dromara/dynamic-tp/badge/star.svg"></a> <a href="https://gitee.com/dromara/dynamic-tp/members"><img src="https://gitee.com/dromara/dynamic-tp/badge/fork.svg"></a> <a href="https://github.com/dromara/dynamic-tp"><img src="https://img.shields.io/github/stars/dromara/dynamic-tp?style=flat-square&logo=github"></a> <a href="https://github.com/dromara/dynamic-tp/network/members"><img src="https://img.shields.io/github/forks/dromara/dynamic-tp?style=flat-square&logo=GitHub"></a> <a href="https://github.com/dromara/dynamic-tp/blob/master/LICENSE"><img src="https://img.shields.io/github/license/dromara/dynamic-tp.svg?style=flat-square"></a> <a target="_blank" href="/resources/img/contact.jpg"><img src='resources/img/wechat.jpg' alt='备注加群'></a> </p> <p align="center"> 官网: <a href="https://dynamictp.cn">https://dynamictp.cn</a> 🔥 </p>

痛点

使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢?

  1. 代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适

  2. 凭经验设置参数值,上线后发现需要调整,改代码重新发布服务,非常麻烦

  3. 线程池相对开发人员来说是个黑盒,运行情况不能及时感知到,直到出现问题

如果有以上痛点,动态可监控线程池框架(DynamicTp)或许能帮助到你。

如果看过 ThreadPoolExecutor 的源码,大概可以知道它对核心参数基本都有提供 set / get 方法以及一些扩展方法,可以在运行时动态修改、获取相应的值,这些方法有:

public void setCorePoolSize(int corePoolSize);
public void setMaximumPoolSize(int maximumPoolSize);
public void setKeepAliveTime(long time, TimeUnit unit);
public void setThreadFactory(ThreadFactory threadFactory);
public void setRejectedExecutionHandler(RejectedExecutionHandler handler);
public void allowCoreThreadTimeOut(boolean value);

public int getCorePoolSize();
public int getMaximumPoolSize();
public long getKeepAliveTime(TimeUnit unit);
public BlockingQueue<Runnable> getQueue();
public RejectedExecutionHandler getRejectedExecutionHandler();
public boolean allowsCoreThreadTimeOut();

protected void beforeExecute(Thread t, Runnable r);
protected void afterExecute(Runnable r, Throwable t);

现在大多数的互联网项目都会采用微服务化部署,有一套自己的服务治理体系,微服务组件中的分布式配置中心 扮演的就是动态修改配置,实时生效的角色。

那么我们是否可以结合配置中心来做运行时线程池参数的动态调整呢?

答案是肯定的,而且配置中心相对都是高可用的,使用它也不用过于担心配置推送失败这类问题,而且也能减少研发动态线程池组件本身的难度和接入的工作量。

综上,可以总结出以下的背景


功能特性

基于以上背景分析,我们对线程池 ThreadPoolExecutor 做一些扩展增强,主要实现以下目标

  1. 实现对运行中线程池参数的动态修改,实时生效

  2. 实时监控线程池的运行状态,触发设置的报警策略时报警,报警信息推送办公平台

  3. 定时采集线程池指标数据,配合像 Grafana 这种可视化监控平台做大盘监控

  4. 集成常用三方中间件内部线程池管理

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


架构设计

框架功能大体可以分为以下几个模块

  1. 配置变更监听模块

  2. 线程池管理模块

  3. 监控模块

  4. 通知告警模块

  5. 三方组件线程池管理模块

技术架构

详细查看官网文档,架构设计


接入步骤

  1. 引入相应配置中心的依赖,具体见官网文档

  2. 配置中心配置线程池实例,配置文件见官网文档

  3. 启动类加 @EnableDynamicTp 注解

  4. 使用 @Resource 或 @Autowired 进行依赖注入,或通过 DtpRegistry.getExecutor("name") 获取

  5. 通过以上 4 步就可以使用了,是不是感觉超级简单呀

更详细使用示例请参考 example 工程及官网文档


通知报警

<img src="resources/img/alarm.jpg" alt="告警" width="50%" /> <img src="resources/img/notice.jpg" alt="变更通知" width="50%" />

更多见官网文档,通知报警


监控

监控数据1 监控数据2 监控数据3

目前框架提供了四种监控数据采集方式,通过 collectorTypes 属性配置监控指标采集类型,默认 Micrometer

  1. Logging:线程池指标数据会以 Json 格式输出到指定的日志文件里

  2. Internal_logging:线程池指标数据会以 Json 格式输出到项目日志文件里

  3. Micrometer:采用监控门面,通过引入相关 Micrometer 依赖采集到相应的存储平台里(如 Prometheus,InfluxDb...)

  4. Endpoint:暴露 Endpoint 端点,可以通过 http 方式实时获取指标数据

更多见官网文档,监控


Star History

Star History Chart


代码托管


联系我

看到这儿,请给项目一个 star,你的支持是我们前进的动力!

使用过程中有任何问题,或者对项目有什么想法或者建议,可以加入社群,跟 1500+ 群友一起交流讨论。

微信群已满 200 人,可以关注微信公众号,加我个人微信拉群(备注:dynamic-tp)。

为了项目更好的发展,请在此进行登记,使用登记


友情链接


特别赞助

JNPF低代码开发平台

<a href="https://www.jnpfsoft.com/?from=dynamic-tp"><img src="/resources/img/jnpfsoft.png"></a>


鸣谢

感谢 JetBrains 对开源项目的支持

<a href="https://jb.gg/OpenSourceSupport"> <img src="https://user-images.githubusercontent.com/8643542/160519107-199319dc-e1cf-4079-94b7-01b6b8d23aa6.png" align="left" height="150" width="150" alt="JetBrains"> </a>