Spring Cloud全解析:熔断之Hystrix隔离策略



Hystrix隔离策略

Hystrix通过隔离限制依赖的并发量和阻塞扩散,Hystrix的隔离策略有两种:

  • 线程隔离(THREAD) 使用该策略,HystrixCommand将会在单独的线程上执行,并发请求受线程池中的线程数的限制,默认使用该策略,因为该策略有一个除网络超时外的额外保护层

    执行依赖调用的线程与请求线程(tomcat、jetty等服务器线程)分离,通过线程池的大小可以控制并发量,当线程池饱和时可以提前拒绝服务,防止依赖问题扩散

  • 信号量隔离(SEMAPHORE) 使用该策略,HystrixCommand将会在请求线程上执行,开销相对较小,并发请求收到信号量个数的限制,其一般仅适用于非网络调用的隔离,只有当调用负载非常高时(每秒调用几百上千次),才会使用信号量隔离,因为负载过高的情况下使用THREAD开销会比较大

线程隔离

线程隔离主要是指线程池隔离,把请求分类交给不同的线程池处理。当一种业务请求处理发生问题时,不会将故障扩散到其他线程池,从而保证其他服务可用

// 服务分组  配置全局唯一标识服务分组的名称,在进行监控时,相同分组的服务会聚合在一起
protected final HystrixCommandGroupKey groupKey;
// 服务标识,配置全局唯一标识服务的名称,默认是类名
protected HystrixCommandKey commandKey;
// 线程池名称,相同线程池名称的线程池是同一个,如果不配置,默认是分组名,此时一个group共用一个线程池
protected HystrixThreadPoolKey threadPoolKey;
// 命令属性配置
protected HystrixCommandProperties.Setter commandPropertiesDefaults;
// 线程池配置
protected HystrixThreadPoolProperties.Setter threadPoolPropertiesDefaults;


public TestCommand(){
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("testGroup"))
                .andCommandKey(HystrixCommandKey.Factory.asKey("command"))
                .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("testGroupPool"))
                .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withCoreSize(10).withMaxQueueSize(10)));
    }

信号量隔离

信号量隔离限制总的并发数,服务使用主线程进行同步调用,没有线程池,如果只是想限制某个服务的总并发调用量可以使用信号量来实现

HystrixCommandProperties.Setter().withExecutionIsolationStrategy(
        HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE
).withExecutionIsolationSemaphoreMaxConcurrentRequests(200); // 限制200并发

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾光师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值