Hippo4j 原理简单解读

文章介绍了Hippo4j作为一款用于解决Java系统线程管理和优化问题的平台,强调了线程池在性能调优中的重要性。Hippo4j通过监控和管理不同线程池,实现对线程的动态调整。文章详细讨论了线程池的API,如核心线程、最大线程和阻塞队列等,并说明了如何在Spring框架下获取并管理线程池。此外,还介绍了Hippo4j客户端和服务端通过长轮询方式进行交互的机制。
摘要由CSDN通过智能技术生成

前言:

       对于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 住请求,直到服务端的数据发生变化,或者等待一定时间超时才会返回。返回后,客户端又会立即再次发起下一次长轮询。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值