HSF | HSFException-HSF thread pool is full

315 阅读2分钟

HSF thread pool is full

发现问题

HSF thread pool is full
hsf 线程池已满
在使用HSF RPC远程调用框架时 经常会遇到 HSF thread pool is full 这种异常,是服务端线程池满了.

遇到这种问题 服务线程池满的情况

image.png

  • 排查代码响应速度,解决响应慢问题
  • 增加服务节点 多节点服务处理
  • 服务线程池 配置

HSF 服务端线程池配置

服务线程池业务示意图

HSF服务端线程池主要分为IO线程和业务线程,其中IO线程模型就是netty reactor网络模型中使用的。我们主要讨论业务线程池的配置。业务线程池分为默认业务线程池和服务线程池,其中服务线程池是从默认线程池中分割出来的。\

image.png

默认线程池配置

服务端线程池是用来执行业务逻辑的线程池,线程池默认的core size是50,max size是720, keepAliveTime 500s。队列使用的是SynchronousQueue,没有缓存队列,不会堆积用户请求。 当服务端线程池所有线程(720)都在处理请求时,对于新的请求,会立即拒绝,返回Thread pool is full异常。可以使用下面VM参数(-D参数)进行配置。

  • 线程池最小配置:-Dhsf.server.min.poolsize
  • 线程池最大配置:-Dhsf.server.max.poolsize
  • 线程收敛的存活时间:-Dhsf.server.thread.keepalive

服务线程池配置

对于一些慢服务、并发高,可以为其单独配置线程池,以免占用过多的业务线程,影响应用的其他服务的调用。

  • api 形式配置HSF 服务
HSFApiProviderBean hsfApiProviderBean = new HSFApiProviderBean();
//...
hsfApiProviderBean.setCorePoolSize("50");
hsfApiProviderBean.setMaxPoolSize("200");
  • Spring配置HSF服务 XML配置
<bean class="com.taobao.hsf.app.spring.util.HSFSpringProviderBean" init-method="init">
    <!--[设置] 发布服务的接口 -->
    <property name="serviceInterface" value="com.alibaba.middleware.hsf.guide.api.service.OrderService"/>
    <property name="corePoolSize" value="50" />
    <property name="maxPoolSize" value="200" />
</bean>
  • pandora-hsf 注解配置HSF服务
@HSFProvider(serviceInterface = OrderService.class, corePoolSize = 50, maxPoolSize = 200)
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderDAO orderDAO;

    @Override
    public OrderModel queryOrder(Long id) {
        return orderDAO.queryOrder(id);
    }
}