在Hystrix中更新命令指标的延迟?

时间:2016-01-14 18:44:38

标签: java hystrix

我正在使用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!

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

但是,如果我在C3之前添加Thread.Sleep(2_000),那么指标就会显示为我期望AND C3失败,正如我期望的那样FailureType.SHORTCIRCUIT

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

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

1 个答案:

答案 0 :(得分:0)

事实证明HystricCommandMetrics#getHealthCounts仅在使用metricsHealthSnapshotIntervalInMilliseconds为给定命令指定的时间段内重新计算一次。

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

作为补充说明,在第一次调用命令后getHealthCounts ms之前调用metricsHealthSnapshotIntervalInMilliseconds给定命令将导致new HealthCounts(0,0,0)

也就是说,健康计数将反映它们初始化的值,直到该时间段第一次到期为止。