1

我将 Hystrix 用于其断路器功能,并且我注意到当满足所需条件时断路器不会立即跳闸。

例如使用以下配置:

withCircuitBreakerRequestVolumeThreshold(2),
withCircuitBreakerErrorThresholdPercentage(50)

如果我同步执行以下命令集(假设 C1-C3 具有相同的 CommandKey)C3 的行为方式我发现是出乎意料的:

// C1: Execute no-op command -- Error threshold 0%, Volume threshold 1
// C2: Execute exception throwing command -- Error threshold 50%, Volume threshold 2
// ---- Breaker should be tripped ----
// C3: Execute no-op command -- This command executes!  But the circuit should be tripped!

我发现如果我HystrixCommandMetrics在 C3 之前检查HealthMetrics显示在滚动窗口中没有执行任何命令。

但是,如果我Thread.Sleep(2_000)在 C3 之前添加 a ,那么指标会按照我的预期显示,并且 C3 会像我预期的那样失败,使用FailureType.SHORTCIRCUIT.

Hystrix 中的指标不是“实时”的吗?也就是说,它们是否由单独的线程管理?如果是这种情况,也许我不应该假设断路器会立即跳闸。

作为后续,有没有办法强制指标生效?

4

1 回答 1

0

事实证明,HystricCommandMetrics#getHealthCounts对于给定命令使用指定的时间段,仅重新计算一次metricsHealthSnapshotIntervalInMilliseconds

默认情况下,此间隔为 500 毫秒。

作为附加说明,在第一次调用命令之后在 msgetHealthCounts之前调用给定命令metricsHealthSnapshotIntervalInMilliseconds将导致new HealthCounts(0,0,0).

也就是说,运行状况计数将反映它们初始化时使用的值,直到该期限第一次到期。

于 2016-01-14T20:27:26.807 回答