项目亮点—动态线程池管理工具

news2024/11/24 17:40:28

问题

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

1.创建线程池核心参数不好评估,随着业务流量的波动,极有可能出现生产故障。

2.不支持优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。

3.不支持运行时监控,使用过程中业务无响应,不知道是不是线程池引起。

4.三方框架 RocketMQ、Dubbo 等线程池无法动态修改参数,修改后只能重启应用。

在真实业务场景中,线程池可能遇到的问题比这里描述的还要多,稀奇古怪。所以采用动态线程池—Hippo4j。

功能

通过对 JDK 线程池的增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保

障能力。

Hippo4j 框架提供以下功能支持:

1. 客户端应用运行时实时变更指定线程池核心参数,变更生效支持集群和单实例两种方式。

2. 线程池运行时异常报警,比如:线程池活跃度、阻塞队列容量水位较高,触发了拒绝策略以

及任务运行时间超长等。

3. 定时任务(默认 5 秒)采集线程池运行数据,可上报 Prometheus、InfluxDB 等数据库,

搭配 Grafana 做大屏展示。

4. 运行过程中支持实时查看线程池当前运行状态以及线程池内线程的堆栈信息。

5. 支持 Tomcat、Undertow 和 Jetty 容器线程池运行时查看和动态变更线程池配置。

6. 支持 Dubbo、Hystrix、Kafka、RabbitMQ、RocketMQ 等客户端线程池运行时数据查看

和动态变更线程池配置。

应用场景

1. 动态调参

Google 或者百度搜索线程池和生产事故关键字,几页都放不下,这也间接说明了线程池是个很

考验使用者技术功底的技术点。

那有没有一些技巧或者技术来尽量规避线程池使用上的问题?比如:线程池的配置应该如何选

择?

对于线程池参数的纠结点主要有两个,无外乎设置的线程数多了或者少了:

1. 如果预设的线程数或阻塞队列数量少了,当业务量上来,任务都在排队或者执行拒绝策

略。

2. 如果超量设置线程池的参数,无疑会造成资源浪费。

如果要修改运行中应用线程池参数,需要停止线上应用,调整成功后再发布,而这个过程异常的

繁琐,如果能在运行中动态调整线程池的参数无疑会提高问题解决效率。

Hippo4j 提供了应用线程池运行时变更核心参数的功能。而且,如果应用是集群部署,可以选择

修改线程池某一实例,或者修改集群全部实例,运行时生效,不需要再重启服务。

压测时可以使用 Hippo4j 动态调整线程池参数,判断线程池核心参数设置是否合理。对于开发

测试来说,如果不满足可以随时调整。

2. 告警策略

很多时候,线程池出故障的时候,系统已经发生了很严重的损失。有没有一种方式,在使用的线

程池即将出现问题,但还算比较可控时,触发相关报警提示给用户,进而规避该问题?

Hippo4j 基于上述问题思考,集成了四种报警策略:

1. 活跃度:假设阈值设置 80%,线程池最大线程数 10,当线程数达到 8 发起报警。

2. 阻塞队列容量:假设阈值设置 80%,阻塞队列容量 100,当容量达到 80 发起报警。

3. 触发拒绝策略:当线程池任务触发了拒绝策略时,发起拒绝策略报警。

4. 任务运行超时:假设用户设置单个任务正常执行是 1000ms,实际执行超过该时间发起报

警。

3. 线程池监控

Hippo4j 线程池提供了两种监控方式:线程池运行时数据采集监控以及客户端线程池运行实时状

态查看。

线程池运行时数据采集适合应用负责人巡查应用健康状态和排查问题时使用,实时状态适合排查

多实例之间的运行数据状态。

4. 框架底层线程池

上面讲的动态线程池是业务中开发人员手动创建的线程池,比如下面这个:

@Bean
@DynamicThreadPool
public ThreadPoolExecutor messageConsumeDynamicExecutor() {
    String threadPoolId = "message-consume";
    return ThreadPoolBuilder.builder()
            .threadFactory(threadPoolId)
            .threadPoolId(threadPoolId)
            .dynamicPool()
            .build();
}

而框架线程池指的是某些三方中间件底层使用到的线程池,比如 Dubbo、RocketMQ 等框架,这些底层框架为了增强性能选择使用线程池进行扩展。

为什么要适配这些中间件框架的线程池?相信这是很多小伙伴的疑问。以 Dubbo 举例,当服务高并发调用时,如果 Dubbo 底层线程池没有经过个性化配置,极有可能导致线程池打满,最终导致无法提供服务。

当遇到这种情况,可以使用 Hippo4j 对 Dubbo 线程池进行核心参数调整,避免生产故障时间持续。

再举个例子,当 RocketMQ 消息积压时,可能大部分公司的解决方案是添加客户端应用节点。而这种方式虽然可以解决问题,但是问题也很明显,太复杂且资源浪费。完全可以调整RocketMQ SDK 底层线程池的线程数来达到快速消费的逻辑,有效解决 MQ 消息堆积问题。

目前 Hippo4j 已支持的三方中间件线程池列表:

Apache Dubbo

Alibaba Dubbo

Apache Kafka

Apache RocketMQ

RabbitMQ

SpringCloud Stream RocketMQ

SpringCloud Hystrix

Tomcat

Jetty

Undertow

上述中间件线程池都可以在 Hippo4j 页面上操作核心参数动态变更以及监控功能,如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java每日一题——分礼物(多线程运用)

前言: 运用了多线程的综合案例,顺便熟悉一下其他语法。打好基础,daydayup!!! 题目: 有100份礼物,小红小明同时发送,当剩下的礼物小于10份的时候则不再送出,利用多线程模拟该过程并将线程的名称…

R2GenCMN中的Encoder_Decoder结构

R2GenCMN中的 Encoder_Decoder 结构 Encoder_Decoder 结构直接关系到文本的生成,它结构参考的transformer的结构 我们这里主要看代码的实现,从视觉编码器的输出开始 1. 模型结构 首先介绍一下整体结构,这里的baseCMN其实就是一个包装了的T…

2024年noc指导教师认证测评参考试题题目5-6合集

[noc指导教师认证] 测评参考试题 说明:NOC教师指导认证考试题目是从题库里抽题,因此每位老师每次考试题目都不一样以下题目为测试考试时收集到的一些题目,作为辅助提供给各位老师,老师们可以记住题目及答案的具体内容 (选项顺序会变),以免考试时遇到。2024年的做的题目有的…

两张图片相似度匹配算法学习路线

大纲:​​​​​​目标跟踪基础:两张图片相似度算法-腾讯云开发者社区-腾讯云 (tencent.com) 目标跟踪基础:两张图片相似度算法 (qq.com) 一、传统方法 1.欧式距离(用于判断是否完全相同) [三维重建] [机器学习] 图…

RAG进阶笔记:RAG进阶

1 查询/索引部分 1.1 层次索引 创建两个索引——一个由摘要组成,另一个由文档块组成分两步进行搜索:首先通过摘要过滤出相关文档,接着只在这个相关群体内进行搜索 1.2 假设性问题 让LLM为每个块生成一个假设性问题,并将这些问…

一文看懂DDR1到DDR5的演变

DDR内存技术自问世以来,已经经历了多代的迭代和优化。每一代DDR内存都在性能、容量、功耗和功能上有所提升。以下是从DDR1到DDR5的主要区别和特点: DDR1 DDR1是第一代双倍数据速率同步动态随机存取存储器,标志着内存技术的一个重要里程碑。…

网安基础2-Sniffer的使用与防范

1. 嗅探器sniffer的工作原理 能捕获经过该网络设备的报文,通过分析网络流量,找出关键信息,解决网络问题。 不同于键盘捕获程序,如keylogger利用中断或钩子技术,Sniffer将网络接口置成适当的模式,如杂收。…

瑞吉外卖实战学习--9、mybatisPlus公共字段自动填充

mybatisPlus公共字段自动填充 前言实现步骤实体类添加注解按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口1、在创建和更新的时候修改创建和更新的时候自动填充时间2、如何获取到当前的id 测试结果 前言…

Vision Mamba 双向状态空间模型下的高效视觉表示学习

论文题目:Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 双向状态空间模型下的高效视觉表示学习 论文链接:http://arxiv.org/abs/2401.09417 代码链接:https://github.com/hustvl/Vim 1、…

Java中的多线程和线程安全问题

线程 线程是操作系统进行调度的最小单位。一个进程至少包含一个主线程,而一个线程可以启动多个子线程。线程之间共享进程的资源,但也有自己的局部变量。多线程程序和普通程序的区别:每个线程都是一个独立的执行流;多个线程之间是…

大模型面试准备(九):简单透彻理解MoE

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 合集在这…

C++list的模拟实现

为了实现list&#xff0c;我们需要实现三个类 一、List的节点类 template<class T> struct ListNode {ListNode(const T& val T()):_pPre(nullptr),_pNext(nullptr),_val(val){}ListNode<T>* _pPre;ListNode<T>* _pNext;T _val; }; 二、List的迭代器…

双网卡环境概率出现DNS解析错误

测试环境 VMware Rocky Linux 9 虚拟机, 双网卡(eth0和eth1)配置如下&#xff1a; eth0 10.206.216.27/24 DNS 10.204.16.18 eth1 192.168.1.27/24 DNS 192.168.1.1问题描述 手动配置eth1的DNS后&#xff0c;网络不通&#xff0c;通过抓包发现是eth1的DNS server配置有误…

【JavaWeb】Day29.SpringBootWeb请求响应——请求(二)

请求响应 4.数组集合参数 数组集合参数的使用场景&#xff1a;在HTML的表单中&#xff0c;有一个表单项是支持多选的(复选框)&#xff0c;可以提交选择的多个值。 4.1 数组 数组参数&#xff1a;请求参数名与形参数组名称相同且请求参数为多个&#xff0c;定义数组类型形参即…

springboot简历系统

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;简历系统当然也不能排除在外。简历系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采用…

速通汇编(三)寄存器及汇编mul、div指令

一&#xff0c;寄存器及标志 AH&ALAX(accumulator)&#xff1a;累加寄存器BH&BLBX(base)&#xff1a;基址寄存器CH&CLCX(count)&#xff1a;计数寄存器DH&DLDX(data)&#xff1a;数据寄存器SP(Stack Pointer)&#xff1a;堆栈指针寄存器BP(Base Pointer)&#…

Vue3+Vite Nginx部署 跨域

打包项目 webstorm打开项目之后&#xff0c;在Terminal执行打包命令 pnpm run build:prod 复制到Nginx 打包完成之后,生成的包在根目录dist&#xff0c;把dist目录拷贝到Nginx放网站目录下&#xff1a;\nginx-1.25.2\html\divided &#xff0c;dist改名了divided 修改配置…

力扣---网络延迟时间---迪杰斯特拉,弗洛伊德floyd

首先推荐博客&#xff1a;图论最短路径专题&#xff08;力扣743、5888&#xff09;_力扣 最短路径-CSDN博客 迪杰斯特拉算法&#xff1a; 太久没有做图论的题了&#xff0c;&#xff0c;临时抱佛脚。。 这道题可以转化为max{点x到点k的距离}。因为带权图&#xff08;权值为正…

[超详细]3种方法判断一个数是否为质数(Python)

(发现好多博客对第三种进阶方法说的不明白&#xff0c;至少我是没完全看明白。后面结合自己的理解应该算是弄懂了&#xff0c;供大家参考&#xff0c;欢迎纠正。) 方法一&#xff1a;最暴力&#xff0c;最简单&#xff0c;也最耗时O(n) 思想&#xff1a;由素数的定义&#xf…

arcgis 无法编辑元素的解决办法(无法删除元素或者缺失值替换)

打开“编辑器”中&#xff0c;“开始编辑”即可进行元素编辑&#xff0c;也可进行缺失值替换 &#xff08;其他方式&#xff1a;选中图层&#xff0c;右击点击开始编辑&#xff09; 在元素编辑状态下无法删除变量&#xff0c;可以删除元素 元素编辑结束后 点击“编辑器”&…