咱们好,我是马称。
最近,有许多同学在微信上问我这么一个问题:
Hippo4j 动态线程池结构是美团开源的么?
类似于这样的问题还挺多,在这里一致回复下:
美团官方并没有开源任何关于动态线程池的结构。
美团官方关于对动态线程池结构的仅有产出,来自于咱们根本上看过或许有印象的一篇博客。
Java线程池完成原理及其在美团事务中的实践
假如不了解动态线程池概念的同学能够深入了解下。文章浅显易懂,讲的很透彻,一起也是美团罪受欢迎的文章之一。
在此之后,美团官方并没有依据动态线程池这个 IDEA 做任何的产出。不过,开源社区依据美团这篇文章做了许多开源结构,比方笔者开源的 Hippo4j,以及别的一位开源作者 DynamicTP 结构等。
说完 Hippo4j 是否美团动态线程池开源后,接下来和咱们聊两件和平常作业有关而且有意思的事。
美团动态线程池结构为什么没有开源
依据我的主意,假如最初美团推出动态线程池概念后,顺势推出一款开源结构,肯定会“爆火”。
毕竟,关于作业这么多年的开发来说,谁的线上环境还没有被线程池“坑”过呢。
可是,实践却没有按照这种想象开展,我就找了在美团作业的朋友聊了聊,下面依据我的了解说下是怎么回事。
1. 依靠工作软件大象
动态参数告诉和线程池运转中报警,都需要通过工作通讯软件或许邮件进行告诉。
通过上面说到的美团动态线程池文章可知,在线程池改变告诉和过载告警功用上,依靠了美团工作通讯软件大象。
假如要开源,怎么进行改造呢?
依据告诉报警方案,其实很好解决,笼统出去一个告诉接口以及中心参数,并供给 SPI 加载方法,根本上就能完成开源兼容适配。
2. 依靠监控工具 Cat
美团线程池支撑检查内部使命等级的履行情况,进行细粒度使命等级监控。
中心原理是通过 Cat Transaction 打点进行的支撑,下图表就是从 Cat 上汇总进行展现。
Cat 这种依靠,不太好替换,因为会对原有事务代码进行侵入。假如说开源方案的话,或许就需要献身一部分功用性或许针对动态线程池结构底层完成这一功用。
3. 依靠音讯行列 Kafka
通过美团文章中看到线程池结构运用了 Kafka 音讯行列,这里暂且当一个存疑点,动态线程池中哪部分事务需要运用 Kafka 呢?
假如说运用动态线程池功用,还需要依靠音讯行列,这或许关于大部分场景来说是说不通用的。
假如要进行开源,我的建议和主意是将这里设置为可替换项。也就是说默许不支撑 MQ 功用,一起对市场上干流 MQ 进行适配。假如客户端项目想用的话,可依据项目实践挑选。
比较常见的是 Seata 和 SkyWalking 的做法,以 SkyWalking 举例,链路数据存储支撑 H2、MySQL、ElasticSearch 等数据库,让用户依据场景以及服务体量灵活挑选。
4. 动态线程池是监控系统中的“小”模块
之前有和美团的一位技术朋友沟通过,为什么美团的动态线程池结构没有开源出来?
他给我的回复是,动态线程池结构仅仅美团监控系统下一个“小”模块。
而且,依据不可靠音讯,好像内部该结构的完成不止一个,假如有美团的哥们看到能够谈论下。
5. 小结
通过上面的剖析,在这里我得出一个定论:美团在最初规划开发动态线程池时,好像就没有打算对外开源。因而才会依靠如此多的组件以及美团内部的产品。
上文中一切主意都是笔者主观主意,实践情况有待考究。
怎么识别结构是否官方开源
1. 开源库房
国内公司中开源结构比较多的,根本上都会在 GitHub 命名空间下运维项目。
这里罗列一些大厂开源公司对应的官方 GitHub 地址。
- 阿里巴巴:github.com/alibaba
- 腾讯:github.com/tencent
- 美团:github.com/meituan
- ……
2. 依靠包地址
在咱们导入依靠包的时候,会输入 groupId、artifactId、version 三种信息,是否官方开源在 groupId 上根本就能表现出来。
groupId:一般由三部分组成,标识.公司名.项目名
,拿 Apache、Alibaba 两个安排的 groupId 举例子阐明。
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>${shardingsphere-jdbc-core-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-starter-alibaba-nacos-discovery.version}</version>
</dependency>
所以,假如说项目为官方开源,那么通过 groupId 很容易就能辨别出来。
3. 非官方地址就不是官方开源的么
非官方地址就不是官方开源的么,也不一定,并不是一切项目都在公司命名空间下开展。
有些项目是独立于公司创立的命名空间,比方说阿里的 seata、ant-design 等。
- github.com/ant-design/…
- github.com/seata/seata
再比方美团一篇比较火的文章,讲的是操作日志怎么记录,相信大多数同学也都有看到。
怎么优雅地记录操作日志?
GitHub:github.com/mouzt/mzt-b…
相同不是官方开源,可是开源项目是由文章本人进行保护,代码质量和项目活跃度不输官方保护项目。
什么是 Hippo4j
上面说了许多关于开源的小知识,接下来向咱们介绍下笔者开源的动态线程池结构 Hippo4j。
原理:通过对 JDK 线程池的增强,以及扩展三方结构底层线程池等功用,为事务系统提高线上运转保证能力。
Hippo4j 供给了两种形式,一种是 依靠配置中心,另一种是 无中间件依靠,部署个 Jar 包就能带来 Web 端控制台运用。
GitHub:github.com/opengoofy/h…
Gitee:gitee.com/magestack/h…
1. 线程池痛点
假如有在项目中实践运用线程池,相信你或许会遇到以下痛点:
- 线程池随便定义,线程资源过多,形成服务器高负载。
- 线程池参数不易评价,随着事务的并发提升,事务面对呈现故障的风险。
- 线程池使命履行时间超过均匀履行周期,开发人员无法感知。
- 线程池使命堆积,触发回绝战略,影响既有事务正常运转。
- 当事务呈现超时、熔断等问题时,因为没有监控,无法确认是不是线程池引起。
- 原生线程池不支撑运转时变量的传递,比方 MDC 上下文遇到线程池就 GG。
- 无法履行优雅封闭,当项目封闭时,大量正在运转的线程池使命被丢弃。
- 线程池运转中,使命履行中止,怀疑发生死锁或履行耗时操作,可是无从下手。
2. 功用支撑
依据以上痛点,Hippo4j 供给以下线程池功用扩展支撑:
- 全局管控 – 办理使用线程池实例。
- 动态改变 – 使用运转时动态改变线程池参数,包含但不限于:中心、最大线程数、阻塞行列容量、回绝战略等。
- 告诉报警 – 内置四种报警告诉战略,线程池活跃度、容量水位、回绝战略以及使命履行时间超长。
- 数据收集 – 支撑多种方法收集线程池数据,包含但不限于:日志、内置收集、Prometheus、InfluxDB、ElasticSearch 等。
- 运转监控 – 实时检查线程池运转时数据,自定义时间内线程池运转数据图表展现。
- 功用扩展 – 支撑线程池使命传递上下文;项目封闭时,支撑等候线程池在指定时间内完成使命。
- 多种形式 – 内置两种运用形式:依靠配置中心 和 无中间件依靠。
- 容器办理 – Tomcat、Jetty、Undertow 容器线程池运转时检查和线程数改变。
- 结构适配 – Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运转时数据检查和线程数改变。
- 改变审阅 – 供给多种用户人物,普通用户改变线程池参数需要 Admin 用户审阅方可生效。
- 动态化插件 – 内置多种线程池插件,支撑用户自定义插件以及运转时扩展。
- 多版别适配 – 通过实践测试,已支撑客户端 SpringBoot 1.5.x => 2.7.5 版别(更高版别未测试)。
3. 小结
截止目前,合计 30+ 公司 线上运用 Hippo4j 办理使用线程池,运用公司中包含付出、电商、快递、保险以及教育等职业。
一起,共有 86 名 开源同学对 Hippo4j 进行了代码贡献,有 10 名 小伙伴持续投入较多精力保护,晋升为 Hippo4j Committer,得到官方支撑 Jetbrains 全家桶 Licenses。
最终总结
关于动态线程池的热度一直居高不下,本篇文章讲述了美团动态线程池的上下文,以及对为什么没有开源进行了简单剖析。
最终得出的定论是:美团最初规划动态线程池时就没有打算开源,所以才会依靠美团相关中间件以及 Kafka 等“重量级”组件。
一起针对有些同学说无法分辩结构是否官方开源,笔者针对这个论题做了几项总结输出。
最终,介绍了下 GitHub 开源范畴中比较火的项目 Hippo4j,假如各位同学觉得不错能够持续关注。
GitHub:github.com/opengoofy/h…
Gitee:gitee.com/magestack/h…