(一) 执行隔离策略

防止提供者被熔断,防止大量客户端请求被阻塞。

1.隔离请求的方式有两种类型:

l 线程隔离 thread:Hystrix 的默认隔离策略。系统会创建一个依赖线程池,为每个依赖请求分配一个独立的线程,而每个依赖所拥有的线程数量是有上限的。当对该依赖的调用请求数量达到上限后再有请求,则该请求阻塞。所以对某依赖的并发量取决于为该依赖所分配的线程数量。
l 信号量隔离:对依赖的调用所使用的线程仍为请求线程,即不会为依赖请求再新创建新的线程。但系统会为每种依赖分配一定数量的信号量,而每个依赖请求分配一个信号号。当对该依赖的调用请求数量达到上限后再有请求,则该请求阻塞。所以对某依赖的并发量取决于为该依赖所分配的信号数量。
l 对比:
u 线程是进程的一个执行体,而信号却不是,其仅是线程执行的条件。
u 线程的数量是有上限的,而信号量不存在上限概念。
u 线程隔离中对依赖的请求线程与调用线程是不同的线程,而信号量隔离是同一个线程
u 在复杂的长链路调用中,信号量隔离的效率会低于线程隔离,因为执行体差一半。
u 在简单的短链路调用中,线程隔离的系统性能会低于信号量隔离。

2.修改策略


若是在配置文件中,则可以通过以下设置修改:
l hystrix.command.default.execution.isolation.strategy=thread
l hystrix.command.default.execution.isolation.strategy=semaphore
若是在代码中,则可通过以下语句修改。
l HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD)
l HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)

3.默认值



在 HystrixCommandProperties 类的构造器中设置有这些高级属性的默认值。


this.executionIsolationStrategy = getProperty(propertyPrefix, key, “execution.isolation.strategy”, builder.getExecutionIsolationStrategy(), default_executionIsolationStrategy);


(二)线程执行超时时限



在默认的线程执行隔离策略中,关于线程的执行时间,可以为其设置超时时限。当然,首先通过下面的属性开启该超时时限,该属性默认是开启的,即默认值为 true。若要关闭,则可以配置文件中设置该属性的值为 false。
hystrix.command.default.execution.timeout.enabled


在开启了执行线程超时时限后,可以通过以下属性设置时限长度。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
其默认值为 1000 毫秒。这就是前面引入时为什么 sleep(4)是也报超时异常的原因,只要超过了 1 秒就会超时。

(三)超时中断



当线程执行超时时是否中断线程的执行。默认为 true,即超时即中断。通过以下属性进行设置。
hystrix.command.default.execution.isolation.thread.interruptOnTimeout

(四)取消中断

在线程执行过程中,若请求取消了,当前执行线程是否结束呢?由该值设置。默认为false,
即取消后不中断。通过以下属性进行设置。
hystrix.command.default.execution.isolation.thread.interruptOnCancel

(五)线程池相关属性[有时间再更新]


关于执行线程的线程池,