依赖出问题时,返回缓存还是默认值?什么时候降级?降级本身会不会慢?过载时降级能换回多少容量?这篇用本机的小服务量出来。
做法 | 阶段 | 请求数 | 拿到真实结果 | 降级结果 | 报错 | 延迟中位数 | p99 | 降级用的缓存的平均年龄
--------+-----+-----+--------+------+------+--------+--------+------------
无降级 | 正常 | 200 | 100% | 0% | 0% | 28 ms | 32 ms | -
| 故障中 | 300 | 0% | 0% | 100% | 502 ms | 504 ms | -
| 恢复后 | 300 | 100% | 0% | 0% | 28 ms | 33 ms | -
降级为默认值 | 正常 | 200 | 100% | 0% | 0% | 29 ms | 32 ms | -
| 故障中 | 300 | 0% | 100% | 0% | 203 ms | 204 ms | -
| 恢复后 | 300 | 100% | 0% | 0% | 29 ms | 32 ms | -
降级为缓存 | 正常 | 200 | 100% | 0% | 0% | 29 ms | 32 ms | -
| 故障中 | 300 | 0% | 100% | 0% | 203 ms | 204 ms | 1.9 s
| 恢复后 | 300 | 100% | 0% | 0% | 28 ms | 32 ms | -
熔断 + 缓存 | 正常 | 200 | 100% | 0% | 0% | 28 ms | 32 ms | -
| 故障中 | 300 | 0% | 100% | 0% | 0 ms | 204 ms | 1.7 s
| 恢复后 | 300 | 77% | 23% | 0% | 25 ms | 33 ms | 3.6 s
(连接类错误 0 次;不是超时,应为 0)降级把报错变成可用的结果,但仍要等超时;熔断打开后才能立刻降级,恢复时又有一段时间继续降级。
超时 | 请求数 | 降级的比例 | 延迟中位数 | p99 | 降级用的缓存的平均年龄 -------+-----+-------+-------+--------+------------ 50 ms | 600 | 3.2% | 29 ms | 53 ms | 0.55 s 100 ms | 600 | 3.2% | 29 ms | 103 ms | 0.60 s 200 ms | 600 | 3.2% | 29 ms | 203 ms | 0.70 s 400 ms | 600 | 3.2% | 28 ms | 403 ms | 0.90 s 800 ms | 600 | 0.0% | 29 ms | 608 ms | 0.00 s (连接类错误 0 次;不是超时,应为 0)
超时越短,p99 越低,代价是用到的缓存更旧。
做法 | 请求数 | 成功速率 | 成功的里面是简化结果的比例 | 成功请求的 p99 ----------------+------+-------+---------------+---------- 一直完整模式 | 1500 | 153/s | 0% | 371 ms 队列 ≥ 10 就切到简化模式 | 1500 | 300/s | 66% | 63 ms
用结果的完整度换容量:简化模式把容量翻倍。