Avez-vous rencontré les problèmes suivants lors de l'utilisation du pool de threads dans votre projet ?
- Il n'est pas facile d'évaluer les paramètres de base de la création d'un pool de threads.Avec la fluctuation du trafic commercial, des pannes de production sont très susceptibles de se produire.
- L'arrêt progressif n'est pas pris en charge et un grand nombre de tâches de pool de threads en cours d'exécution sont ignorées lorsque le projet est fermé.
- Il ne prend pas en charge la surveillance de l'exécution et l'entreprise ne répond pas pendant l'utilisation.Je ne sais pas si cela est causé par le pool de threads.
- Les pools de threads tels que les frameworks tripartites RocketMQ et Dubbo ne peuvent pas modifier dynamiquement les paramètres, et l'application ne peut être redémarrée qu'après modification.
Dans des scénarios commerciaux réels, le pool de threads peut rencontrer plus de problèmes que ceux décrits ici, qui sont étranges.
Dans les projets que j'ai vécus, plusieurs accidents de production ont été déclenchés car l'entreprise n'a pas configuré raisonnablement les paramètres du pool de threads. Vers le 21 juin, j'ai commencé à rechercher des projets de pool de threads dynamiques sur Internet.
J'ai trouvé beaucoup de projets de pool de threads dynamiques sur la plate-forme open source.En termes de fonctionnalité et de robustesse, j'ai personnellement le sentiment qu'ils ne sont pas satisfaits des applications de niveau entreprise.
Parce que je suis plus intéressé par le pool de threads dynamiques et que je veux écrire un projet significatif, j'ai décidé de construire moi-même une roue légère.
GitHub : github.com/opengoofy/h…
Fonctions principales
Grâce à l'amélioration du pool de threads JDK et à l'expansion du pool de threads sous-jacent du cadre tripartite, il améliore la capacité de garantie de fonctionnement en ligne pour le système d'entreprise.
Le framework Hippo4j prend en charge les fonctionnalités suivantes :
- Contrôle global - Gérez toutes les instances de pool de threads des applications clientes.
- Modification dynamique - modifiez dynamiquement les paramètres de base du pool de threads lorsque l'application est en cours d'exécution.
- Alarme de notification - plusieurs stratégies de notification d'alarme intégrées, l'activité du pool de threads, le niveau d'eau de la capacité, la stratégie de rejet et le temps d'exécution des tâches sont trop longs.
- Collecte de données - prend en charge plusieurs façons de collecter les données du pool de threads, y compris, mais sans s'y limiter : les journaux, la collecte intégrée, Prometheus, InfluxDB, ElasticSearch, etc.
- Surveillance des opérations - affichez les données d'exécution du pool de threads en temps réel et affichez le tableau des données de fonctionnement du pool de threads dans un délai personnalisé.
- Extension de fonction - prend en charge le contexte de transfert de tâche du pool de threads ; lorsque le projet est fermé, il prend en charge l'attente que le pool de threads termine la tâche dans le délai spécifié.
- 多种模式 - 内置两种使用模式:依赖配置中心 和 无中间件依赖。
- 容器管理 - 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. Principe de changement de mode du centre de configuration
2. Adaptez-vous à SpringBoot 1.5 et 2.x
3. Le principe sous-jacent
Si votre entreprise n'utilise pas le scénario Hippo4j, je vous recommande également de lire les principes sous-jacents du projet, principalement pour les raisons suivantes :
- Afin d'améliorer la qualité du code et le comportement d'expansion ultérieur, divers modèles de conception sont utilisés pour obtenir une cohésion élevée et un faible couplage.
- La couche inférieure du framework s'appuie sur le framework Spring pour s'exécuter et utilise de nombreuses fonctions liées à Spring dans le code source.
- Utilisez une variété d'outils dans le cadre du package de concurrence JUC pour assurer la sécurité d'un fonctionnement multithread et comprendre la programmation simultanée à travers des scénarios réels.
- Apprenez des frameworks open source traditionnels Nacos et Eureka pour réaliser les fonctions de centre de configuration léger et de centre d'enregistrement.
- Personnalisez la mise en œuvre du cadre RPC, encapsulez Netty pour compléter l'optimisation de la communication réseau client/serveur.
- Standardisez l'écriture de code via des plug-ins tels que CheckStyle et Spotless pour garantir un comportement et un style de code de haute qualité.
résumé final
Hippo4j est un framework de pool de threads dynamique de la communauté open source OpenGoofy. Il a l'expérience réelle de la production de plus de 32 entreprises et a expérimenté le test de centaines d'applications connectées à un seul nœud.
Il est open source depuis près de deux ans. Au cours de cette période, 17 versions ont été publiées. Au total, plus de 32 entreprises l'ont déployé et utilisé en production. Ils ont récolté Star 4.8k, 10 contributeurs principaux Committer et 100 contributeurs Contributor.
GitHub : github.com/opengoofy/h…