你是否在项目中使用线程池遇到过以下问题?
- 创建线程池中心参数欠好评价,随着事务流量的波动,极有或许呈现出产故障。
- 不支撑优雅封闭,当项目封闭时,许多正在运转的线程池使命被丢掉。
- 不支撑运转时监控,使用进程中事务无呼应,不知道是不是线程池引起。
- 三方结构 RocketMQ、Dubbo 等线程池无法动态修正参数,修正后只能重启使用。
在真实事务场景中,线程池或许遇到的问题比这儿描述的还要多,稀奇古怪。
笔者所经历过的项目,由于事务对线程池参数没有合理装备,就触发过几起出产事故。大概在 21 年 6 月份左右,开端在网上搜索动态线程池的项目。
在开源渠道找了挺多动态线程池项目,从功用性以及健壮性而言,个人感觉不满足企业级使用。
由于对动态线程池比较感兴趣,加上想写一个有意义的项目,所以决议自己来造一个轻量级的轮子。
GitHub:github.com/opengoofy/h…
Gitee:gitee.com/opengoofy/h…
中心功用
通过对 JDK 线程池的增强,以及扩展三方结构底层线程池等功用,为事务体系进步线上运转保证才能。
Hippo4j 结构供给以下功用支撑:
- 大局管控 – 办理客户端使用悉数线程池实例。
- 动态改变 – 使用运转时动态改变线程池中心参数。
- 告诉报警 – 内置多种报警告诉战略,线程池活跃度、容量水位、回绝战略以及使命履行时刻超长。
- 数据收集 – 支撑多种方式收集线程池数据,包含但不限于:日志、内置收集、Prometheus、InfluxDB、ElasticSearch 等。
- 运转监控 – 实时检查线程池运转时数据,自定义时刻内线程池运转数据图表展示。
- 功用扩展 – 支撑线程池使命传递上下文;项目封闭时,支撑等待线程池在指定时刻内完成使命。
- 多种形式 – 内置两种使用形式:依靠装备中心 和 无中间件依靠。
- 容器办理 – Tomcat、Jetty、Undertow 容器线程池运转时检查和线程数改变。
- 结构适配 – Dubbo、Hystrix、Kafka、RabbitMQ、RocketMQ 等消费线程池运转时数据检查和线程数改变。
- 改变审阅 – 供给多种用户人物,普通用户改变线程池参数需求 Admin 用户审阅方可收效。
- 动态化插件 – 内置多种线程池插件,支撑用户自定义插件以及运转时扩展。
- 多版别适配 – 通过实践测验,已支撑客户端 SpringBoot 1.5.x => 2.7.5 版别(更高版别未测验)。
使用场景
1. 动态调参
事务中使用了线程池,大部分程序员或许都在犯嘀咕,这线程池的装备应该怎么选择?
我觉得犯纠结的点主要有两个,无外乎设置的线程数多了或许少了。
- 假如预设的线程数或堵塞行列数量少了,当事务量上来,使命都在排队或许履行回绝战略。
- 假如过量设置线程池的参数,无疑会造成资源浪费。
假如要修正运转中使用线程池参数,需求停止线上使用,调整成功后再发布,而这个进程异常的繁琐,假如能在运转中动态调整线程池的参数无疑会进步问题解决效率。
假如使用是集群布置,Hippo4j 可以选择修正线程池 某一实例,或许修正集群悉数实例,运转时收效,不需求再重启服务。
压测时可以使用 Hippo4j 动态调整线程池参数,判别线程池中心参数设置是否合理。关于开发测验来说,假如不满足可以随时调整。
2. 告警战略
从线程池运转时监控的角度出发,hippo4j 内置 4 种报警战略,线程池活跃度、堵塞行列容量、回绝战略触发以及使命运转超时报警。
- 线程池活跃度:假定阈值设置 80%,线程池最大线程数 10,当线程数到达 8 建议报警。
- 堵塞行列容量:假定阈值设置 80%,堵塞行列容量 100,当容量到达 80 建议报警。
- 触发回绝战略:当线程池使命触发了回绝战略时,建议回绝战略报警。
- 使命运转超时:假定单个使命超时为 1000ms,使命履行超过该时刻建议报警。
Hippo4j 支撑钉钉、企业微信和飞书软件告诉,线程池使命运转超时报警示例:
3. 线程池监控
Hippo4j 内部供给了两种监控方式:线程池中心参数监控以及线程池实例运转时状况检查。
1)线程池中心参数监控。
2)线程池实例运转时状况。
通过两种监控方式,可以方便快捷把握线程池运转时的数据状况,可以用作健康巡查以及历史问题复盘。
4. 中间件线程池
Hippo4j 的目标是兼容一切中间件的线程池,并可以供给监控和动态修正的才能。
Q:为什么要适配这些中间件结构的线程池?
A:信任这是许多小伙伴的疑问。以 Dubbo 举例,由于当服务高并发调用时,假如 Dubbo 底层线程池没有通过个性化装备,极有或许导致线程池打满,终究导致无法供给服务。
当遇到这种状况,可以使用 Hippo4j 对 Dubbo 线程池进行中心参数调整,防止出产故障时刻持续。
现在 Hippo4j 已支撑的三方中间件线程池列表:
- Apache Dubbo
- Alibaba Dubbo
- RabbitMQ
- Apache RocketMQ
- SpringCloud Stream RocketMQ
- SpringCloud Hystrix
- Tomcat
- Jetty
- Undertow
上述中间件线程池都可以在 Hippo4j 页面上操作中心参数动态改变以及监控功用,如下所示:
未来 Hippo4j 会支撑更多三方结构线程池,假如你有好的想法也可以和我沟通。
模块阐明
深化原理
假如一上来就下载 Hippo4j 的源码来看,很容易迷失进去。这儿给我们画了几张图,协助我们在阅览源码时,可以抓住主干分支,更快上手 Hippo4j 结构源码。
1. 装备中心形式改变原理
2. 适配 SpringBoot 1.5 & 2.x
3. 底层原理
假如您公司没有使用 Hippo4j 场景的话,我也建议去阅览下项目的底层原理,主要有以下几个原因:
- 为了进步代码质量以及后续的扩展行为,运用多种设计形式完成高内聚、低耦合。
- 结构底层依靠 Spring 结构运转,并在源码中许多使用 Spring 相关功用。
- 运用 JUC 并发包下多种东西保证多线程运转安全,通过实践场景理解并发编程。
- 学习主流开源结构 Nacos、Eureka 完成轻量级装备中心和注册中心功用。
- 自定义 RPC 结构完成,封装 Netty 完成客户端/服务端网络通信优化。
- 通过 CheckStyle、Spotless 等插件标准代码编写,保证高质量代码行为和代码款式。
最后总结
Hippo4j 是 OpenGoofy 开源社区动态线程池结构,已有 32+ 公司出产实践使用经验,经历单节点连接数百使用考验。
至今已开源接近两年时刻,期间发布 17 次 Release 版别,共 32+ 公司布置出产使用,收成 Star 4.8k,10 位中心贡献者 Committer,100 位贡献者 Contributor。
GitHub:github.com/opengoofy/h…
Gitee:gitee.com/opengoofy/h…