Hystrix隔离策略
Hystrix通过隔离限制依赖的并发量和阻塞扩散,Hystrix的隔离策略有两种:
线程隔离(THREAD) 使用该策略,HystrixCommand将会在单独的线程上执行,并发请求受线程池中的线程数的限制,默认使用该策略,因为该策略有一个除网络超时外的额外保护层
执行依赖调用的线程与请求线程(tomcat、jetty等服务器线程)分离,通过线程池的大小可以控制并发量,当线程池饱和时可以提前拒绝服务,防止依赖问题扩散
信号量隔离(SEMAPHORE) 使用该策略,HystrixCommand将会在请求线程上执行,开销相对较小,并发请求收到信号量个数的限制,其一般仅适用于非网络调用的隔离,只有当调用负载非常高时(每秒调用几百上千次),才会使用信号量隔离,因为负载过高的情况下使用THREAD开销会比较大
线程隔离
线程隔离主要是指线程池隔离,把请求分类交给不同的线程池处理。当一种业务请求处理发生问题时,不会将故障扩散到其他线程池,从而保证其他服务可用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| protected final HystrixCommandGroupKey groupKey;
protected HystrixCommandKey commandKey;
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))); }
|
信号量隔离
信号量隔离限制总的并发数,服务使用主线程进行同步调用,没有线程池,如果只是想限制某个服务的总并发调用量可以使用信号量来实现
1 2 3
| HystrixCommandProperties.Setter().withExecutionIsolationStrategy( HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE ).withExecutionIsolationSemaphoreMaxConcurrentRequests(200);
|