1.线程隔离策略提供了两层保护:
(图片来源参考资料1)
1.1 一层保护
当hystrix线程池并发限制已经被占满的时候,此时新的request就会触发fallback逻辑。
// 线程池并发限制相关配置格式参考:
threadPoolProperties = {
@HystrixProperty(name = HystrixPropertiesManager.CORE_SIZE,value = "3"),//线程池大小
@HystrixProperty(name = HystrixPropertiesManager.MAX_QUEUE_SIZE,value = "0"),//最大队列阈值,默认-1
@HystrixProperty(name = HystrixPropertiesManager.KEEP_ALIVE_TIME_MINUTES,value = "2"),//线程存活时间,默认1分钟
@HystrixProperty(name = HystrixPropertiesManager.QUEUE_SIZE_REJECTION_THRESHOLD,value = "0")//超出队列等待阈值拒绝策略
}
1.2 二层保护
当一个request通过了hystrix线程池的并发限制,此时该request对应两个线程(callerThread和hystrixThread)。调用下游服务时,超过了hystrix超时时间。
此时callerThread会使用fallback方法的返回值,进行返回(这就是线程隔离策略提供的二层保护)。
// hystrix超时配置
commandProperties = {
//超时时间,默认 1000 ms
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,
value = "2000")
}
此时hystrixThread会继续自己的逻辑:
当超时中断配置为true,hystrix会向hystrixThread发送InterruptedException。
当超时中断配置为false,hystrix不会向hystrixThread发送InterruptedException,hystrixThread继续执行直到结束。
// 超时中断配置
commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_INTERRUPT_ON_TIMEOUT,
value = "true")
}
2. 信号量隔离策略:
(图片来源参考资料1)
因为信号量隔离策略,一个请求只对应一个callerThread。 因此只有并发限制的一层保护策略。(参考1.1)。
hystrix的超时配置也对信号量隔离策略不生效。超时后,hystrix也不会向callerThread线程发送InterruptedException。
// 信号量隔离策略配置
commandProperties = {
//超时时间(无效)
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,
value = "3000"),
// 中断配置(无效)
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_INTERRUPT_ON_TIMEOUT,
value = "true"),
//信号量隔离
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY,
value = "SEMAPHORE"),
//信号量最大并发
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS,
value = "3")
}
3. 隔离策略如何选择:
线程隔离策略涉及创建新线程,线程上下文切换,执行性能是低于信号量策略的。
下游服务没有超时风险,选择信号量隔离策略。
4. 参考资料:
1. 在基于微服务的体系结构中配置hystrix以实现有效的容错