按慢调用比例熔断有什么价值?
简化版
慢调用比例熔断能在请求尚未大量报错、却已长时间占用线程和连接时提前止血,避免“全都成功但系统被拖死”。 它用慢调用阈值、统计窗口、最小样本数和比例共同判断,并通过半开探测恢复;阈值必须结合接口 SLO 与正常延迟分布设置。
详细版
例如定义耗时超过 800ms 为慢调用,最近 10 秒至少 100 次调用且慢调用比例达到 60% 时 OPEN 30 秒。最小样本避免低流量误判,时间阈值界定什么叫慢,比例区分偶发长尾与系统性退化。
慢调用统计的是完整调用耗时,通常与失败率熔断并列,任一条件满足即可打开。被本地排队拖慢的时间是否计入要明确;从用户保护角度应观察端到端延迟,从定位依赖角度则分解队列等待和远端耗时。恢复只放少量探测,并监控线程、连接与 P99 是否同步回落。
完整版教学
一、为什么成功率正常仍可能雪崩
下游从 50ms 变成 2s,但最终都返回 200。上游 100 个工作线程原本每秒可周转约 2000 次,耗时变成 2s 后理论周转仅约 50 次,大量请求开始排队。只按错误率熔断要等超时出现才行动,已经太晚。
记忆钩子:错误消耗一次失败,慢调用持续占住一份资源;“慢而不死”同样危险。
二、四个参数共同定义触发
slow = duration >= 800ms
window = latest 10s
minimumCalls = 100
slowRateThreshold = 60%
窗口里有 120 次调用、其中 75 次超过 800ms,慢比例为 75/120=62.5%,满足触发;只有 3 次且都慢时,因为未到 100 次不判断。四个参数缺一都会改变灵敏度。
三、慢阈值如何从 SLO 推导
慢阈值不应复制别的服务配置。若接口 P99 SLO 为 300ms,把 2s 才算慢会失去保护意义;批处理接口正常耗时 5s,用 800ms 又会永久熔断。可以从历史健康期分布、用户 deadline 和资源持有成本共同确定。
| 接口 | 健康 P99 | 用户 deadline | 慢阈值示例 |
|---|---|---|---|
| 商品查询 | 180ms | 500ms | 300ms |
| 报表生成 | 4s | 15s | 8s |
| 支付确认 | 400ms | 2s | 1s |
四、统计口径要拆开等待与执行
端到端耗时可拆为本地队列、连接获取、网络、远端执行和响应反序列化。若只统计远端 RPC,线程池队列已经等 1 秒也不会触发;若全部混在一起,又可能把本机 CPU 抖动误判为下游故障。最佳实践是用端到端值保护用户,同时分别记录各阶段用于定位。
total = queueWait + connectionWait + remote + decode
五、与失败率、超时和并发限制协作
慢比例和失败率是熔断器的两个触发器;调用超时限制单次资源占用;并发隔离限制同时占用数量。它们互补而非替代。慢阈值应小于上层 deadline,才能在用户超时前观察到退化。
假设并发上限 80、远端耗时 1s,最多约 80 QPS;入口仍来 500 QPS 时,即使熔断判断窗口尚未结束,也需要有界队列和快速拒绝保护。
六、半开恢复与防振荡
OPEN 30 秒后可放 5 个探测,要求至少 4 个低于慢阈值且无失败,再逐步关闭。一次快请求不足以证明缓存、连接池和数据库都已恢复。多实例探测要加时间抖动,避免同时给下游发送恢复洪峰。
指标至少包括慢调用数/比例、各阶段耗时、状态切换、OPEN 拒绝、半开结果和规则版本。阈值先影子计算,看历史数据上会触发多少次,再灰度执行。
七、常见误区与追问
- 误区:只要最终成功就不该熔断。 长时间占用资源会让整个调用链失去吞吐。
- 误区:慢阈值统一设为 1 秒。 不同接口的 SLO 和延迟分布不同。
- 误区:没有最小调用数也没关系。 低流量下一个慢请求就会误熔断。
- 误区:慢调用熔断可以替代 timeout。 熔断看群体历史,timeout 限制单次调用。
- 追问:本地排队算慢调用吗? 用户保护口径应算,依赖健康口径要拆分记录。
- 追问:流量骤增造成变慢怎么办? 熔断之外还需并发控制、限流和舱壁隔离。
- 追问:如何验证阈值? 用健康历史回放、压测与故障注入比较误触发和止血时间。
八、加强记忆
慢调用熔断按“多慢、看多久、样本够不够、慢的占多少”四问配置。它在错误爆发前发现资源周转下降,再与 timeout、并发限制和半开探测组成闭环。回答时给出 800ms、10 秒、100 次、60% 的完整算例,比只说“按比例熔断”更清楚。