前言:
对于java系统性能调优,大家的关注点很多都集中在jvm内存、cpu、连接等,只有一部分人会关注到系统中真正干活的线程,这些线程好比一个公司的职员,公司各个部门的人员配比如何?以及这些人员是忙着呢,还是闲着呢?
对于流量较大或者任务型的系统,必须确保线程有合适的配比。Hippo4j就是解决这样问题的平台。
原理篇
1)线程池
线程池化是目前线程管理事实上的标准,Hippo4j管理线程事实上是管理不同的线程池。
线程池能被管理吗?或者说线程池能被监控、统计以及动态调整吗?答案是肯定的。
下面罗列ThreadPoolExecutor类部分api:
核心线程
- setCorePoolSize
- getCorePoolSize
最大线程
- setMaximumPoolSize
- getMaximumPoolSize
阻塞队列
- getQueue
存活的线程
- getActiveCount
获取线程堆栈信息
- ThreadPoolExecuto.workers
2)如何获取到这些线程呢?
Hippo4j是基于spring框架开发的。不同的第三方组件依赖线程池的方式不同,Hippo4j需要做的就是在项目启动的过程中,挨个适配捕获不同组件依赖的线程池。然后将他们注册到服务端进行管理起来。下面我们看一个
解释:
ApplicationStartedEvent是spring2.0的消息,也就是如果要对接hippo4j 1.5那么就需要依赖spring boot2.0,此消息是spring 容器已经刷新完毕但是业务流量还没进来。
由于spring 容器已经刷新完毕,因此可以通过spring容器获取已经实例化后的目标类
ApplicationContextHolder.getBeansOfType(DefaultRocketMQListenerContainer.class)
然后通过反射ReflectUtil就可以获得到线程池了,进而就可以组件依赖的控制线程了。
3)Hippo4j 客户端如何与服务端交互?
Hippo4j客户端与服务通信,参考nacos实现的长轮询。
轮询
是指不管服务端数据有无更新,客户端每隔定长时间请求拉取一次数据,可能有更新数据返回,也可能什么都没有。
长轮询
客户端发起长轮询,如果服务端的数据没有发生变更,会 hold 住请求,直到服务端的数据发生变化,或者等待一定时间超时才会返回。返回后,客户端又会立即再次发起下一次长轮询。
文章介绍了Hippo4j作为一款用于解决Java系统线程管理和优化问题的平台,强调了线程池在性能调优中的重要性。Hippo4j通过监控和管理不同线程池,实现对线程的动态调整。文章详细讨论了线程池的API,如核心线程、最大线程和阻塞队列等,并说明了如何在Spring框架下获取并管理线程池。此外,还介绍了Hippo4j客户端和服务端通过长轮询方式进行交互的机制。
372

被折叠的 条评论
为什么被折叠?



