hystrix使用线程池(THREAD)和信号量(SEMAPHORE)隔离策略区别

本文详细介绍了Hystrix的线程隔离和信号量隔离策略,以及它们在微服务容错中的作用。线程隔离提供两层保护,当线程池满时触发回退,并在超时时中断请求。而信号量隔离仅提供并发限制,不支持超时中断。根据下游服务的特性,选择合适的隔离策略以优化性能。
摘要由CSDN通过智能技术生成

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以实现有效的容错

2.基于 Hystrix 高并发服务限流第 2 篇 (参考其工程代码)

3. 线程隔离和信号量隔离的区别

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值