在压测FeignClient接口时候,发现FeignClient接口处理请求的能力和Hystrix为其提供的线程池大小有关。
测试代码:
@FeignClient (value="service-provider", fallbackFactory= providerServiceFallbackFactory.class)
public interface testService {
@RequestMapping(value="/v1/test",method= RequestMethod.POST)
Result test(@RequestBody TestEntity testEntity);
}
并发测试后异常:
Task java.util.concurrent.FutureTask@27d69e27 rejected from java.util.concurrent.ThreadPoolExecutor@61d1c14e[Running, pool size = 10, active threads = 10, queued tasks = 0, completed tasks = 62058]
原因分析:
1. 并发数太大,触发了熔断。
2. 熔断原因和ThreadPoolExecutor有关,并且提示pool size是10,线程池满了,无法提交任务。
查看Hystrix官方文档:
Hystrix使用舱壁模式(bulkhead pattern)隔离每个依赖,从而限制对依赖的并发访问。
客户端(库,网络请求等等)运行在不同的线程。这使它们独立于请求线程(Tomcat线程池),因此请求线程可以在依赖线程花费时间太长时,摆脱此依赖线程。
Hystrix为每个依赖提供一个小的线程池(或信号)(默认10个线程),如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。
可以通过设置依赖线程池默认大小,提高并发处理能力。在application.yml里面:
hystrix:
threadpool:
service-provider:
coreSize: 100