Hystrix
的隔离策略有两种:
- 线程隔离
- 信号量隔离
THREAD
(线程隔离):使用该方式,HystrixCommand
将会在单独的线程上执行,并发请求受线程池中线程数量的限制。Hystrix
中默认并且推荐使用线程隔离。
SEMAPHORE
(信号量隔离):使用该方式,HystrixCommand
将会在调用线程上执行,开销相对较小,并发请求受信号量的个数的限制。
一般来说,只有当调用负载非常高时(例如每个实例每秒调用数百次)才需要使用信号量隔离,因为这种场景下使用THREAD
开销会比较高。信号量隔离一般仅适用于非网络调用的隔离。
如果想传播线程本地上下文到@HystrixCommand
,默认声明不会工作,因为它会在线程池中执行命令(在超时的情况下)。可以使用一些配置,让Hystrix
使用相同的线程,或者直接在注解中让Hystrix
使用不同的隔离策略。
@HystrixCommand(fallbackMethod = "stubMyService",
commandProperties = {
@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
}
)
总结:
Hystrix
的隔离策略有THREAD
和SEMAPHONE
两种,默认是THREAD
。- 正常情况下,保持默认即可。
- 如果发生找不到上下文的运行时异常,可考虑将隔离策略设置为
SEMAPHONE
。