Update README.md

pull/161/head
chen.ma 3 years ago
parent f94c1bfc8f
commit f6a0d09efb

@ -2,14 +2,11 @@
<img src="https://images-machen.oss-cn-beijing.aliyuncs.com/Dynamic-Thread-Pool-Main.jpeg" /> <img src="https://images-machen.oss-cn-beijing.aliyuncs.com/Dynamic-Thread-Pool-Main.jpeg" />
</div> </div>
<p align="center"> <p align="center">
<strong> :fire: &nbsp; 动态线程池DTP系统包含 <a href="https://github.com/acmenlt/dynamic-threadpool/tree/develop/dynamic-threadpool-server">Server</a> 端及 SpringBoot Client 端需引入的 <a href="https://github.com/acmenlt/dynamic-threadpool/tree/develop/dynamic-threadpool-spring-boot-starter">Starter</a>.</strong> <strong> :fire: &nbsp; 动态线程池DTP系统包含 <a href="https://github.com/acmenlt/dynamic-threadpool/tree/develop/dynamic-threadpool-server">Server</a> 端及 SpringBoot Client 端需引入的 <a href="https://github.com/acmenlt/dynamic-threadpool/tree/develop/dynamic-threadpool-spring-boot-starter">Starter</a>.</strong>
</p> </p>
<p align="center"> <p align="center">
<img src="https://img.shields.io/badge/Author-龙台-blue.svg" /> <img src="https://img.shields.io/badge/Author-龙台-blue.svg" />
<a target="_blank" href="http://mp.weixin.qq.com/s?__biz=Mzg4NDU0Mjk5OQ==&mid=100007373&idx=1&sn=3b375f97a576820e3e540810e720aeb0&chksm=4fb7c6b578c04fa35fab488d8dd6ddd12cfd0ef70290f3b285261fba0750785ea2725a50d508&scene=18#wechat_redirect"> <a target="_blank" href="http://mp.weixin.qq.com/s?__biz=Mzg4NDU0Mjk5OQ==&mid=100007373&idx=1&sn=3b375f97a576820e3e540810e720aeb0&chksm=4fb7c6b578c04fa35fab488d8dd6ddd12cfd0ef70290f3b285261fba0750785ea2725a50d508&scene=18#wechat_redirect">
@ -36,53 +33,57 @@
<br/> <br/>
## 这个项目做什么 ## 为什么写这个项目?
动态线程池Dynamic-ThreadPool下面简称 DTP 系统 [美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html "美团线程池文章") 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能
[美团线程池文章](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html) 介绍中,因为业务对线程池参数没有合理配置,触发过几起生产事故,进而引发了一系列思考。最终决定封装线程池动态参数调整,扩展线程池监控以及消息报警等功能 在开源平台找了挺多动态线程池项目,从功能性以及健壮性而言,个人感觉不满足企业级应用
笔者不喜欢重复造轮子,因为美团并没有开源动态线程池系统,所以选择造一个轻量级的轮子 因为对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决定自己来造一个轻量级的轮子
想给项目起一个简单易记的名字,类似于 Eureka、Nacos、Redis后来和朋友商量决定以动物命名**Hippo河马**
```java
├── dynamic-threadpool
│ ├── dynamic-threadpool-common -- 公共模块
│ ├── dynamic-threadpool-config -- 配置中心
│ ├── dynamic-threadpool-console -- 控制台
│ ├── dynamic-threadpool-discovery -- 注册中心
│ ├── dynamic-threadpool-spring-boot-starter -- Client 依赖组件
│ ├── dynamic-threadpool-example -- 示例项目
│ └── dynamic-threadpool-server -- 服务端
│ └── dynamic-threadpool-tools -- 抽象工具类
```
<br/> <br/>
## 它解决了什么问题? ## 它解决了什么问题?
线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程 线程池在业务系统应该都有使用到,帮助业务流程提升效率以及管理线程,多数场景应用于大量的异步任务处理
但是线程池也并非尽善尽美。比如下面这些问题就无法很好解决:
1. 核心线程过小,阻塞队列过小,最大线程过小,**导致接口频繁抛出拒绝策略异常** 虽然线程池提供了我们许多便利,但也并非尽善尽美,比如下面这些问题就无法很好解决
2. 核心线程过小,阻塞队列过小,最大线程过大,**导致线程调度开销增大,处理速度下降**
3. 核心线程过小,阻塞队列过大,导致任务堆积,**接口响应或者程序执行时间拉长**
4. 核心线程过大,**导致线程池内空闲线程过多,过多的占用系统资源**,造成资源浪费
如果线程池的配置涉及到上述问题,那么就有可能需要发布业务系统来解决;如果发布后参数仍不合理,继续发布...... ![](https://images-machen.oss-cn-beijing.aliyuncs.com/image-20211023160830084.png)
DTP 系统很好解决了这个问题,它将业务中所有线程池统一管理,遇到上述问题不需要发布系统就可以替换线程池参数 <br/>
另外,支持看线程池运行实时状态。如果监控发现线程池负载、队列负载以及拒绝策略指标异常,判断参数是否合理,可以及时排查问题以及修复 如果线程池的配置涉及到上述问题,那么就有可能需要发布业务系统来解决;如果发布后参数仍不合理,继续发布......
Hippo 很好解决了这个问题,它将业务中所有线程池统一管理,遇到上述问题不需要发布系统就可以替换线程池参数
![](https://images-machen.oss-cn-beijing.aliyuncs.com/image-20211023142726818.png)
<br/> <br/>
## 它有什么特性? ## 它有什么特性?
应用系统中线程池并不容易管理。为此DTP 项目按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作 应用系统中线程池并不容易管理。参考美团的设计Hippo 按照租户、项目、线程池的维度划分。再加上系统权限,让不同的开发、管理人员负责自己系统的线程池操作
举个例子,笔者在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目
从功能性上来说DTP 系统是对标美团文章中所介绍的。所以DTP 系统除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。具体功能如下图
![](https://images-machen.oss-cn-beijing.aliyuncs.com/image-20210807134946141.png)
举个例子,小编在一家公司的公共组件团队,团队中负责消息、短链接网关等项目。公共组件是租户,消息或短链接就是项目
笔者并没有接触过美团线程池的具体功能,只是在文章上看了功能介绍,所以在完成路径上会有所差池 Hippo 除去动态修改线程池,还包含实时查看线程池运行时指标、负载报警、配置日志管理等。具体功能如下图
![](https://images-machen.oss-cn-beijing.aliyuncs.com/image-20211023101844619.png)
<br/> <br/>
@ -90,14 +91,12 @@ DTP 系统很好解决了这个问题,它将业务中所有线程池统一管
目前动态线程池功能已经完成,可以直接把代码拉到本地运行。项目中数据库是作者 ECS Docker 搭建,大家直接使用即可 目前动态线程池功能已经完成,可以直接把代码拉到本地运行。项目中数据库是作者 ECS Docker 搭建,大家直接使用即可
1. 启动 dynamic-threadpool-server 模块下 ServerApplication 应用类 1. 启动 `dynamic-threadpool-server` 模块下 ServerApplication 应用类
2. 启动 dynamic-threadpool-example 模块下 ExampleApplication 应用类 2. 启动 `dynamic-threadpool-example` 模块下 ExampleApplication 应用类
<br/> <br/>
通过接口修改线程池中的配置。HTTP POST 路径http://localhost:6691/v1/cs/configs Body 请求体如下: 通过接口修改线程池中的配置。HTTP POST 路径http://localhost:6691/v1/cs/configsBody 请求体如下:
```json ```json
{ {
@ -119,7 +118,6 @@ DTP 系统很好解决了这个问题,它将业务中所有线程池统一管
<br/> <br/>
接口调用成功后,观察 dynamic-threadpool-example 控制台日志输出,日志输出包括不限于此信息即为成功 接口调用成功后,观察 dynamic-threadpool-example 控制台日志输出,日志输出包括不限于此信息即为成功
```tex ```tex
@ -129,7 +127,7 @@ capacity :: [100=>100], keepAliveTime :: [10000=>10000], rejectedType :: [7=>7]
<br/> <br/>
现阶段集成钉钉消息推送,后续会持续接入企业微信、邮箱、飞书、短信等通知渠道 现阶段集成钉钉消息推送,后续会持续接入企业微信、邮箱、飞书、短信等通知渠道。可以通过添加钉钉群体验消息推送群号31764717
<table> <table>
<tr> <tr>
@ -142,7 +140,7 @@ capacity :: [100=>100], keepAliveTime :: [10000=>10000], rejectedType :: [7=>7]
<td align="center" style="width: 200px;"> <td align="center" style="width: 200px;">
<a href="https://github.com/acmenlt"> <a href="https://github.com/acmenlt">
<img src="https://images-machen.oss-cn-beijing.aliyuncs.com/image-20211013113649068.png" style="width: 400px;"><br> <img src="https://images-machen.oss-cn-beijing.aliyuncs.com/image-20211013113649068.png" style="width: 400px;"><br>
<sub>告警发送</sub> <sub>报警通知</sub>
</a><br> </a><br>
</td> </td>
</tr> </tr>
@ -150,37 +148,24 @@ capacity :: [100=>100], keepAliveTime :: [10000=>10000], rejectedType :: [7=>7]
<br/> <br/>
项目代码功能还在持续开发,初定发布 1.0.0 RELEASE 完成以下功能。部署了 Server 服务,只需要引入 Starter 模块到业务系统中,即可完成动态修改、监控、报警等特性,敬请期待 项目代码功能还在持续开发,初定发布 1.0.0 RELEASE 完成以下功能。部署了 Server 服务,只需要引入 Starter 组件到业务系统中,即可完成动态修改、监控、报警等特性
<br/> <br/>
## 查看源码能收获什么? ## 查看源码能收获什么?
DTP 项目还没有发布 Release 版本,小伙伴可以阅读框架源码,查看框架中好的设计理念或者编码技巧 还没有发布 Release 版本,小伙伴可以阅读框架源码,查看框架中好的设计理念或者编码技巧
在项目开发过程中,借鉴了 Nacos、Eureka、Seata、ShardingSphere 等中间件项目的优雅设计 在项目开发过程中,借鉴了 Nacos、Eureka、Seata、ShardingSphere 等中间件项目的优雅设计
- 配置“实时”刷新:参考 Nacos 1.x 配置中心的长轮询模型Server 端修改线程池配置Client 端“实时”刷新 ![](https://images-machen.oss-cn-beijing.aliyuncs.com/image-20211023143632685.png)
- Client 实例集群注册 Server参考 Eureka 1.x 节点注册、续约、下线等设计,完成 Server 端查看 Client 端的应用实例情况,以此实现线程池运行状态的实时查看
- ShardingSphere 对 SPI 机制的封装,自定义加载、创建、注册等逻辑,自定义 ServiceLoader 异常信息
- ......
<br/> <br/>
从框架本身的编码来说,可能对大家有帮助的技术点
- 设计模式的应用SPI 设计、模版方法模式、Builder 模式、工厂模式、策略模式、责任链模式等
- Spring 后置处理器BeanPostProcessor注册 Client 端线程池以及订阅 Server 端配置变更
- 线程池监控报警,触发报警的维度:线程池活跃度、阻塞队列容量、拒绝策略执行等
- ......
<br/>
## 最后 ## 最后
笔者是个有代码洁癖的程序员,项目中的代码开发完全遵守阿里巴巴代码规约,也推荐大家使用,培养好的编码习惯 小编是个有代码洁癖的程序员,项目中的代码开发完全遵守阿里巴巴代码规约,也推荐大家使用,培养好的编码习惯
屏幕前的小伙伴,如果觉得项目功能规划、代码设计还不错的话,辛苦点个 🚀 Star ,方便后续查看
如果小伙伴看到这里,觉得项目功能规划、代码设计还不错的话,辛苦点个 🚀 Star ,方便后续查看,祝好。 对于这个项目,是否有什么不一样看法,欢迎在评论区一起沟通交流~

Loading…
Cancel
Save