SLO 是起点
例:月可用性 99.95%,错误预算约 21.6 分钟。没有目标,就无法判断该花多少钱、容忍多少降级。
可用性不是“永不失败”,而是当依赖变慢、流量突增、机器故障时,系统仍能保护核心链路、快速恢复,并给用户一个可理解的结果。用电商下单案例,一次学会超时、重试、熔断、隔离、限流与降级。
例:月可用性 99.95%,错误预算约 21.6 分钟。没有目标,就无法判断该花多少钱、容忍多少降级。
没有超时,线程与连接会无限等待;后面的重试、熔断、隔离都失去可信边界。
次数有界、等待有界、并发有界、队列有界、降级范围有界。无限就是雪崩的别名。
前提是请求可重复、仍有时间预算,并且退避带随机抖动,避免客户端同时再冲一次。
确定性错误重试不会变好,只会增加延迟与负载。支付类写操作没有幂等键也不能盲重试。
同时监控额外流量、重试后成功率与总延迟。成功率涨了但 P99 和下游负载爆了,仍是坏设计。
全局、租户、用户、IP、API、资源成本。登录与导出报表不能使用同一个成本权重。
网关做粗粒度保护,服务内按业务成本二次限制,下游还要有自己的硬容量防线。
HTTP 429 + Retry-After + 可识别错误码。客户端遵守退避,不能把拒绝变成重试风暴。
| 策略 | 解决什么 | 关键参数 | 最大风险 | 核心指标 |
|---|---|---|---|---|
| 重试 | 吸收瞬时故障 | 次数、退避、抖动、总 deadline | 流量放大、重复写 | 重试后成功率、额外调用量 |
| 熔断 | 停止持续失败调用 | 窗口、最小样本、阈值、冷却 | 误熔断、全局化 | 状态、拒绝数、半开成功率 |
| 隔离 | 限制故障爆炸半径 | 并发、池大小、队列、排队超时 | 池太碎或容量错配 | 池饱和度、排队时间、拒绝率 |
| 限流 | 保护硬容量 | 速率、突发量、维度、权重 | 不公平、客户端重试风暴 | 429、通过率、容量水位 |
| 降级 | 保核心可用 | 触发条件、兜底、新鲜度、恢复 | 静默返回错误业务数据 | 降级率、兜底命中、业务转化 |
上游 deadline > 本地处理 + 下游 timeout + 有界重试退避。任何下游超时都不能超过剩余总预算。
注入延迟、错误、连接耗尽与流量突增;观察策略是否按预期触发、恢复,并确认核心链路指标。
优先用 SLO、成功率、P99 与业务完成率告警,再用 CPU、线程池、熔断状态定位原因。
system-desgin/,运行 make check,再运行 make demo。单独观察可用 make retry、make circuit、make bulkhead、make rate-limit、make degrade。