Hystrix多个线程池切换执行超时带来的问题(图解)
线程池切换带来的超时问题
上图有什么问题:
Controller的Hystrx线程池已经到了超时时间,而FeignClient的Hystrx线程池还没到超时时间。
场景:
- Controller 抛出运行超时异常,进入熔断回退方法。
- FeignClient 由于是单独的线程池并且超时时间还没到,所以继续执行,占用20-1的线程。
问题:
- 其他的请求进入,调用FeignClient ,FeignClient 线程池应为超时时间未到来,线程已经沾满,进入等待中?(设置了等待队列并且断路器没有开启的情况下)。
- Controller的Hystrx线程池在等待中已经到了超时时间,Controller继续失败,FeignClient 线程还在运行。
- 恶性循环。。。。
如下图:
注意事项:
自定义的Hystrix线程池超时时间不要大于Feign的超时时间。
该问题在:hystrix运行原理官方文档 注意事项中 :
请注意,没有任何方式可以强制终止一个潜在[latent]的线程的运行,Hystrix能够做的最好的方式是让JVM抛出一个InterruptedException异常,如果你的任务被Hystrix所包装,并不意味着会抛出一个InterruptedExceptions异常,该线程在Hystrix的线程池内会进行执行,虽然在客户端已经接收到了TimeoutException异常,这个行为能够渗透到Hystrix的线程池中,[though the load is 'correctly shed'],绝大多数的Http Client不会将这一行为视为InterruptedExceptions,所以,请确保正确配置连接或者读取/写入的超时时间。