你是否在项目中使用线程池遇到过以下问题?

  • 创建线程池中心参数欠好评价,随着事务流量的波动,极有或许呈现出产故障。
  • 不支撑优雅封闭,当项目封闭时,许多正在运转的线程池使命被丢掉。
  • 不支撑运转时监控,使用进程中事务无呼应,不知道是不是线程池引起。
  • 三方结构 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…