本文介绍开发 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 服务

    Spring 框架是在应用中广泛使用的组件,如果不想通过 API 的形式配置 HSF 服务,可以使用 Spring XML 的形式进行配置,上述例子中的 API 配置等同于如下 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>
  • 注解配置 HSF 服务

    SpringBoot 广泛使用的今天,使用注解装配 SpringBean 也成为一种选择,HSF 也支持使用注解进行配置,用来发布服务。

    1. 在项目中增加依赖 starter。
      <dependency>
          <groupId>com.alibaba.boot</groupId>
          <artifactId>pandora-hsf-spring-boot-starter</artifactId>
      </dependency>
    2. 将 @HSFProvider 配置到实现的类型。
      上述例子中的 API 配置等同于如下注解配置。
      @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);
          }
      }