Hystrix配置

19

我正在尝试使用hystrix-javanica为我的应用程序实现hystrix。

我已经按如下配置了hystrix-configuration.properties

hystrix.command.default.execution.isolation.strategy=SEMAPHORE
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 
hystrix.command.default.fallback.enabled=true
hystrix.command.default.circuitBreaker.enabled=true
hystrix.command.default.circuitBreaker.requestVolumeThreshold=3 
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=50000
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50

短路模式正常工作,但我对这个 hystrix.command.default.circuitBreaker.requestVolumeThreshold=3 有疑问:

  1. 它是指在3次失败后打开电路, 还是
  2. 在3个并发故障之后打开电路?

已查阅文档链接

有人能回答吗?

 

 

2个回答

59

Hystrix熔断器的操作方式:

Hystrix没有提供根据失败次数进行熔断的熔断器。只有在以下情况下,Hystrix熔断器才会熔断:

在一段时间metrics.rollingStats.timeInMilliseconds内,处理异常的操作所占比例超过了errorThresholdPercentage,同时该时间段内通过电路的操作数量至少为requestVolumeThreshold


什么是requestVolumeThreshold?

requestVolumeThreshold是必须满足的最小阈值,表示必须在每个滚动时间窗口内达到的电路调用量(数量),在这之前,电路不会计算任何失败率百分比。只有当满足此最小阈值时,电路才会将您的调用故障比例与您配置的errorThresholdPercentage进行比较。

想象一下如果没有这样的电路最小阈值,如果在一个时间窗口内第一次调用错误,那么你的电路的1次调用中就会有1次错误,=100%的故障率,这高于你设置的50%阈值。因此,电路会立即熔断。

requestVolumeThreshold的存在是为了防止这种情况发生。它实际上是在说,除非每个时间窗口内至少收到requestVolumeThreshold个调用,否则你电路中的错误率不具有“统计学意义”(并且不会与errorThresholdPercentage进行比较)。


滚动窗口有点困惑。你能再解释一下吗?根据我的配置,电路在3次失败后应该是开放的,不是吗? - Jay
3
请参考 https://github.com/Netflix/Hystrix/wiki/How-it-Works#circuit-breaker 了解断路器的工作原理。你配置的数字3并不是触发断路的故障数。Hystrix 断路器根据在给定时间窗口内调用的错误百分比(您配置的 errorThresholdPercentage=50%)进行断路,而非错误次数。在同一时间窗口内,必须满足最小调用量阈值(requestVolumeThreshold=3,与我的初始答案相符),以使百分比计算具有统计学意义。 - mountain traveller
请参阅 https://github.com/Netflix/Hystrix/wiki/Configuration#metricsrollingstatstimeinmilliseconds 了解时间窗口的配置方式。 - mountain traveller
1
对于使用相同原理的断路器,您也可以在此处简明地解释:https://github.com/App-vNext/Polly/wiki/Advanced-Circuit-Breaker#the-advancedcircuitbreaker-v42。虽然使用的配置术语不同(它是一个.NET而不是Java产品),但操作原理相同。 Polly页面还提供了一些关于各种配置参数如何交互的解释(例如,如果您将它们设置得太高或太低会发生什么等)。 - mountain traveller
@山行者:我的第一个请求错误本身就调用了我的回退方法。我没有显式配置“requestVolumeThreshold”。你能帮我吗?我只是按照https://spring.io/guides/gs/circuit-breaker/的指南操作。 - Guna

1

我对hystrix比较新,但我想我可以帮助你。

一般而言,hystrix.command.default.circuitBreaker.requestVolumeThreshold是一个属性,它设置了在一个滚动窗口期内触发熔断器所需的最小请求数,其默认值为20,该值可以在属性文件或我们的@HystrixCommand注解方法中进行更改。

例如,如果该属性值为20,则即使所有19个请求都失败了,在滚动窗口期(比如10秒)内只收到了19个请求,熔断器也不会打开。如果失败的请求数达到了20,则熔断器将被打开,并且相应的调用将被发送到fallback,即使调用成功,直到睡眠窗口时间段结束。

睡眠窗口时间段设置了在触发熔断器后拒绝请求的时间量,然后再次尝试确定是否应再次关闭熔断器。其默认值为5000毫秒。这可以通过覆盖circuitBreaker.sleepWindowInMilliseconds属性来更改。

你可以在这里找到所有属性及其描述。

你可能需要查看:https://github.com/Netflix/Hystrix/wiki/Configuration#circuitbreakererrorthresholdpercentage。你的答案是不正确的,没有考虑到`errorThresholdPercentage`。希望这可以帮助你。请参见https://github.com/Netflix/Hystrix/blob/master/hystrix-core/src/main/java/com/netflix/hystrix/HystrixCircuitBreaker.java#L191和https://github.com/Netflix/Hystrix/blob/master/hystrix-core/src/main/java/com/netflix/hystrix/HystrixCircuitBreaker.java#L196。 - mountain traveller
有没有办法验证这些配置属性,以确保这些属性真正应用于配置HystrixCommand? - pijushcse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接