最近有很多同学在微信上问我这个问题:Hippo4j动态线程池框架是美团开源的吗?类似这样的问题比较多,这里统一回复一下:美团没有开源任何动态线程池的框架。美团在动态线程池框架上的唯一官方输出来自一篇大家基本都看过或者有印象的博客。Java线程池的实现原理及其在美团业务中的实践如果对动态线程池的概念不了解的可以多了解下。文章简单透彻,也是美团上最受欢迎的文章之一。之后,美团官方并没有基于动态线程池的IDEA进行任何输出。但是开源社区基于美团这篇文章做了很多开源框架,比如作者开源的Hippo4j,还有另外一个开源作者的DynamicTP框架。说完Hippo4j是否开源美团动态线程池,再说两件与日常工作相关的趣事。公众号:Martin玩编程,关注回复:信息,领取后台技术专家成长手册。为什么美团的动态线程池框架不开源?按照我的想法,如果美团在推出动态线程池概念后推出开源框架,那肯定会“爆”。毕竟干了这么多年的开发,谁的线上环境还没有被线程池“坑”过呢。然而现实并没有按照这个想法发展,所以我和一个在美团工作的朋友聊了聊,我就根据我的理解来解释一下到底是怎么回事。1.依赖办公软件大象动态参数通知和线程池运行告警,都需要通过办公通讯软件或邮件通知。根据上文提到的美团动态线程池文章,其线程池变更通知和过载预警功能依赖于美团办公通讯软件大象。如果要开源,怎么改造呢?基于通知告警方案,其实很容易解决。抽象出通知接口和核心参数,提供SPI加载方法,基本可以完成开源兼容适配。2.依托监控工具美团猫线程池支持查看内部任务级别的执行状态,进行细粒度的任务级别监控。核心原则是通过CatTransaction管理支持。下图是Cat的总结和展示。Cat的依赖不好替换,因为会侵入原有的业务代码。如果是开源的方案,可能需要牺牲一些功能或者为动态线程池框架底层实现这个功能。3、依赖消息队列Kafka通过美团的文章,我们可以看到线程池框架使用的是Kafka消息队列。这里有一个疑点,动态线程池里面哪部分业务需要用到Kafka?如果使用动态线程池功能,还需要依赖消息队列,这对于大多数场景来说可能并不常见。如果你想开源,我的建议和想法是把这个设置为备选方案。即默认不支持MQ功能,适配市场主流MQ。如果客户项目要使用,可以根据实际项目选择。比较常见的方法是Seata和SkyWalking。以SkyWalking为例,链路数据存储支持H2、MySQL、ElasticSearch等数据库,用户可以根据场景和业务量灵活选择。4、动态线程池是监控系统中的一个“小”模块。之前跟一个美团的技术朋友交流过。为什么美团的动态线程池框架一直没有开源?他给我的回复是,动态线程池框架只是美团监控体系下的一个“小”模块。此外,根据不可靠的消息来源,该框架的内部实现似乎不止一个。有美团的小伙伴可以评论。5.总结经过上面的分析,这里得出一个结论:美团在最初设计开发动态线程池的时候,好像并没有打算开源。这就是为什么我们依赖美团的这么多组件和内部产品。以上所有想法均为作者主观想法,具体情况还需具体研究。如何识别框架是否正式开源1、开源仓库国内公司的开源框架很多,基本都是在GitHub命名空间下运维项目。下面是一些开源大公司对应的官方GitHub地址。阿里巴巴:https://github.com/alibaba腾讯:https://github.com/tencent美团:https://github.com/meituan……2.依赖包地址我们在打包的时候导入依赖,会输入groupId、artifactId、version三种信息。是否官方开源基本可以在groupId中体现出来。groupId:一般由三部分组成,标识。公司名称。项目名。以Apache和Alibaba的groupId为例。org.apache.shardingsphereshardingsphere-jdbc-core-spring-boot-starter${shardingsphere-jdbc-core-spring-boot-starter.版本}com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery${spring-cloud-starter-alibaba-nacos-discovery.version}所以,如果项目是正式开源的,可以通过groupId轻松识别。3、非官方地址不是官方开源的吗?非官方地址未正式开源,不一定,不是所有的项目都是在公司命名空间下开发的。有些项目是公司独立创建的namespace,比如阿里的seata,ant-design等https://github.com/ant-design/ant-designhttps://github.com/seata/seata又比如一个美团比较火的一篇文章,讲的是如何记录操作日志。相信大部分同学也都知道见过。如何优雅地记录操作日志?GitHub:https://github.com/mouzt/mzt-biz-log同样没有正式开源,但是开源项目由文章自己维护,代码质量和项目活跃度不输官方维护项目。什么是Hippo4j上面已经说了很多关于开源的小知识,接下来介绍笔者开源的动态线程池框架Hippo4j。原理:通过JDK线程池的增强、三方框架底层线程池的扩展等,提高业务系统的在线运行保障能力。Hippo4j提供了两种模式,一种是依赖配置中心,另一种是不依赖中间件。部署Jar包可以使Web控制台使用。GitHub:https://github.com/opengoofy/hippo4jGitee:https://gitee.com/magestack/hippo4j1。线程池痛点如果你真正在项目中使用线程池,相信你可能会遇到以下痛点:线程池如果随便定义,线程资源过多,导致服务器负载过高。线程池参数不容易评估。随着业务并发量的增加,业务面临失败的风险。线程池任务执行时间超过平均执行周期,开发者无法感知。线程池任务堆积,触发拒绝策略,影响现有业务的正常运行。当业务出现超时、断路等问题时,因为没有监控,无法判断是否是线程池导致的。本机线程池不支持运行时变量的传递。比如MDC上下文遇到线程池就会GG。无法正常关闭,项目关闭时大量正在运行的线程池任务被丢弃。线程池运行的时候,任务执行停止了,怀疑死锁或者执行了耗时操作,但是没有办法启动。2.功能支持基于以上痛点,Hippo4j提供了以下对线程池功能的扩展支持:全局控制——管理应用程序线程池实例。动态变化——在应用运行时动态改变线程池参数,包括但不限于:核心、最大线程数、阻塞队列容量、拒绝策略等通知告警——内置四种告警通知策略、线程池活动、容量水位、拒绝策略和任务执行时间过长。数据采集??——支持多种方式采集线程池数据,包括但不限于:日志、内置采集、Prometheus、InfluxDB、ElasticSearch等运行监控——实时查看线程池运行时数据,并展示自定义时间内的线程池运行数据图表。功能扩展——支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。多种模式——内置两种使用模式:依赖配置中心和无中间件依赖。容器管理——Tomcat、Jetty、Undertow容器线程池运行时查看和线程数变化。框架适配——Dubbo、Hystrix、RabbitMQ、RocketMQ等消费者线程池运行时查看数据和改变线程数。Changeaudit-提供多种用户角色,普通用户需要经过Admin用户的审核才能更改线程池参数生效。动态插件——内置多线程池插件,支持用户自定义插件和运行时扩展。多版本适配——经实际测试,客户端SpringBoot1.5.x=>2.7.5版本已支持(更高版本未测试)。3.总结截至目前,共有30+家公司在线使用Hippo4j管理应用线程池,包括支付、电商、快递、保险、教育等行业。同时,共有86位开源同学为Hippo4j做出代码贡献,10位小伙伴持续投入更多精力维护,晋升为Hippo4jCommitter,并获得JetbrainsFamilyBucketLicenses官方支持。最后得出结论,动态线程池的流行度一直居高不下。本文介绍了美团动态线程池的来龙去脉,简单分析了为什么没有开源。最后得出的结论是,美团最初设计动态线程池时,并没有打算开源,所以依赖了美团相关的中间件和Kafka等“重量级”组件。同时,针对部分同学表示无法判断框架是否正式开源的问题,笔者针对该话题做了几个总结输出。最后介绍一下GitHub开源领域比较火的项目Hippo4j。觉得不错可以继续关注。GitHub:https://github.com/opengoofy/hippo4jGitee:https://gitee.com/magestack/hippo4j