spring-cloud – 为什么ZUUL强制执行SEMAPHORE隔离以执行其Hystrix命令?

我注意到Spring-Cloud ZUUL强制执行隔离到SEMAPHORE而不是THREAD默认值(根据Netflix的推荐).

org.springframework.cloud.netflix.zuul.filters.route.RibbonCommand中的评论说:

we want to default to semaphore-isolation since this wraps
2 others commands that are already thread isolated

但我仍然没有得到它:-(那两个其他命令是什么?

以这种方式配置,Zuul只能调整加载但不允许超时并让客户端离开.简而言之,即使Hystrix超时设置为1000毫秒,只有在转发到链中的服务的调用返回时(或者由于例如ReadTimeout而超时),才会释放客户端.

我试图通过覆盖配置强制THREAD隔离(不幸的是,每个服务,因为在代码中强制默认),一切似乎都按预期工作.但是,如果没有正确理解其含义,我并不热衷于这样做 – 当然关于代码中的注释以及Spring的Zuul版本采用的默认值.

有人可以提供更多信息吗?
谢谢

最佳答案
Hystrix documentation有一个很好的例子,说明为什么在包装线程隔离的命令时信号量隔离是合适的.具体来说,它说:

The façade HystrixCommand can use semaphore-isolation since all of the work it is doing is going through two other HystrixCommands that are already thread-isolated. It is unnecessary to have yet another layer of threading as long as the run() method of the façade is not doing any other network calls, retry logic, or other “error prone” things.

更新:问题提到必须为每个服务配置线程隔离,但我发现您可以通过设置以下属性来控制所有Hystrix命令(包括RibbonCommands)的隔离:

hystrix.command.default.execution.isolation.strategy = THREAD

转载注明原文:spring-cloud – 为什么ZUUL强制执行SEMAPHORE隔离以执行其Hystrix命令? - 代码日志