可靠性设计不是堆组件,而是让故障有边界:请求不能无限等待,重试不能放大流量,过载时要尽早拒绝,依赖故障时要停止无效调用,并保留核心能力。
五种手段的职责
| 手段 | 解决的问题 | 主要风险 |
|---|---|---|
| 超时 | 限制一次等待时间 | 设置过短导致误失败 |
| 重试 | 应对短暂故障 | 重试风暴、重复副作用 |
| 限流 | 控制进入系统的流量 | 拒绝策略不清晰 |
| 熔断 | 暂停调用持续失败的依赖 | 恢复探测不合理 |
| 降级 | 保留核心功能 | 返回过旧或不完整数据 |
通常先有超时,再谈重试;重试必须有次数、指数退避、随机抖动和总时间预算。非幂等写操作不能盲目重试。
一次故障如何被放大
1 | 支付依赖变慢 |
可行保护:为支付调用设置短于总请求的超时,只重试明确的瞬时错误,限制并发,达到失败阈值后熔断,并把非核心展示降级为稍旧缓存。
三组观测方法
Golden Signals:
- Latency:延迟。
- Traffic:流量。
- Errors:错误。
- Saturation:饱和度。
RED 适合请求型服务:Rate、Errors、Duration。USE 适合资源:Utilization、Saturation、Errors。
1 | 告警 -> 指标确认影响范围 -> Trace 找慢链路 |
告警应该可行动
“CPU 超过 80%”不应成为固定真理。阈值要结合服务基线、持续时间、用户影响和 SLO。更有用的告警通常是“错误率持续升高且影响关键请求”或“队列按当前消费速率将在 20 分钟后超过容量”。
最小可观测闭环
- 指标回答系统是否出问题、影响多大。
- 日志回答某次请求发生了什么。
- Trace 回答时间花在哪个跨服务步骤。
- 请求 ID、用户或设备 ID、版本号和节点信息让三者可以关联。
敏感数据不能直接进入日志,尤其是 Token、密码、完整身份证件和支付信息。