HSF thread pool is full
发现问题
HSF thread pool is full
hsf 线程池已满
在使用HSF RPC远程调用框架时 经常会遇到 HSF thread pool is full
这种异常,是服务端线程池满了.
遇到这种问题 服务线程池满的情况
- 排查代码响应速度,解决响应慢问题
- 增加服务节点 多节点服务处理
- 服务线程池 配置
HSF 服务端线程池配置
服务线程池业务示意图
HSF服务端线程池主要分为IO线程和业务线程,其中IO线程模型就是netty reactor网络模型中使用的。我们主要讨论业务线程池的配置。业务线程池分为默认业务线程池和服务线程池,其中服务线程池是从默认线程池中分割出来的。
默认线程池配置
服务端线程池是用来执行业务逻辑的线程池,线程池默认的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);
}
}