我正在使用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之前检查HystrixCommandMetrics
,HealthMetrics
显示滚动窗口中没有执行任何命令。
但是,如果我在C3之前添加Thread.Sleep(2_000)
,那么指标就会显示为我期望AND C3失败,正如我期望的那样FailureType.SHORTCIRCUIT
。
Hystrix中的指标是否“生效”?也就是说,它们是由一个单独的线程管理的吗?如果是这种情况,也许我不应该假设断路器会立即跳闸。
作为后续内容,有没有办法强制指标生效?
答案 0 :(得分:0)
事实证明HystricCommandMetrics#getHealthCounts
仅在使用metricsHealthSnapshotIntervalInMilliseconds
为给定命令指定的时间段内重新计算一次。
默认情况下,此间隔为500毫秒。
作为补充说明,在第一次调用命令后getHealthCounts
ms之前调用metricsHealthSnapshotIntervalInMilliseconds
给定命令将导致new HealthCounts(0,0,0)
。
也就是说,健康计数将反映它们初始化的值,直到该时间段第一次到期为止。