云原生弹性设计
把 Timeout、Retry、Backoff、Idempotency、Circuit Breaker、Bulkhead、Rate Limit、Backpressure 与 Fallback 放在同一条故障控制链中理解。
[!info] related notes
- 所属 MOC:Reliability Engineering MOC
- 核心模式:Timeout、Retry、Circuit Breaker、Bulkhead、Backpressure
- Agent 映射:Agent Runtime MOC
- 观测:Observability Engineering MOC
云原生弹性设计
[!abstract] 核心结论 弹性设计默认网络、节点和依赖都会失败,通过 Timeout、Cancellation、Retry、Idempotency、Circuit Breaker、Bulkhead、Rate Limit、Backpressure、Fallback 和生命周期管理,把故障限制在可接受范围内。
模式必须按故障链组合
请求进入:认证/授权、入口容量与总 Deadline
→ 每次尝试前:检查剩余预算、Breaker 和资源配额
→ 执行:副作用具备幂等边界,传播 Timeout / Cancellation
→ 返回后:分类结果;未知副作用先确认状态
→ 可安全重试:Backoff + Jitter,重新经过尝试前检查
→ 无法重试:选择获准且兼容的 Fallback 或明确失败
→ 全程观测;必要时恢复与核对状态
这是职责时序示意,不是固定 middleware 嵌套顺序。具体组合还需说明重试期间是否占用并发槽位、Breaker 统计每次尝试还是最终结果,以及排队等待是否计入 Deadline。
模式职责
| 模式 | 主要问题 | 常见误区 |
|---|---|---|
| Timeout | 等待无限增长 | 超时后底层工作仍继续 |
| Cancellation | 停止无用工作、释放资源 | 只在最外层取消 |
| Retry | 瞬时故障 | 对 4xx、业务拒绝也重试 |
| Backoff + Jitter | 重试风暴和同步恢复 | 所有客户端固定间隔重试 |
| Idempotency | 重复执行副作用 | 只在前端防重复点击 |
| Circuit Breaker | 持续故障拖垮调用方 | 把所有错误都计入熔断 |
| Bulkhead | 单一依赖耗尽共享资源 | 所有依赖共用同一线程/连接池 |
| Rate Limit | 限制入口负载 | 当成下游背压 |
| Backpressure | Consumer 处理不过来 | 使用无界队列“先接再说” |
| Fallback | 保留最低可用能力 | 静默输出低质量或错误结果 |
三个最重要的组合
Timeout + Cancellation
Timeout 判断“超过预算”,Cancellation 传递停止请求;是否真正停止仍取决于下游是否支持并响应取消。无法终止的工作需要隔离与状态核对,不能把停止等待等同于副作用已回滚。
Retry + Idempotency
request succeeds
→ response lost
→ client retries
这是正常网络故障窗口。写操作必须用 Idempotency Key、唯一约束或状态机让重复请求安全。
Circuit Breaker + Bulkhead
Circuit Breaker 减少对持续故障依赖的调用;Bulkhead 防止该依赖耗尽所有线程、连接、队列或并发槽位。一个控制请求,一个控制资源故障域。
Rate Limit 与 Backpressure
Rate Limit
→ 决定多少新请求可以进入
Backpressure
→ 下游处理不过来时,限制在途、排队、拒绝或降速
两者常同时存在,但信号来源和治理对象不同。
Fallback 必须保留契约
错误示例:RAG 失败后直接让模型自由回答,却仍把结果标记为“基于专业证据”。
更稳妥:
retrieval failed
→ clearly mark evidence unavailable
→ restrict answer scope
→ ask user / defer / escalate
Fallback 需要独立 Eval 和可观测标记。
Health Check 与 Graceful Shutdown
Liveness → 进程是否需要重启
Readiness → 是否应该继续接新流量
Business Health → 核心依赖/能力是否满足服务条件
关闭时先撤销 Readiness、停止接收新任务,再按协议排空或取消在途工作。只有处理结果达到持久化承诺后才能 ACK;未完成任务应保留恢复或重投路径。随后关闭连接,并设置硬 Deadline,记录强制退出后可能未知的副作用。
Liveness 不宜因共享下游短暂故障就失败,否则可能引发集体重启;Readiness 是否依赖某项外部能力,应按该实例仍能服务的请求范围决定。
Agent 场景
| 故障 | 弹性策略 |
|---|---|
| Model 429 / 5xx | Retry Budget、Backoff、Provider Fallback |
| Tool 超时 | Deadline、Cancellation、幂等与状态确认 |
| SSE 断线 | Event ID、Resume / Replay、明确失败状态 |
| RAG 无结果 | Abstain、Ask User、受限 Fallback |
| Run 积压 | Concurrency Quota、Queue、Backpressure |
| Checkpoint 失败 | Fail Closed、Recovery / Reconciliation |
常见反模式
- 每一层都各自重试三次,形成 Retry Amplification;
- 无界 Queue 隐藏过载,直到内存耗尽;
- Fallback 后不记录使用了哪个模型/能力;
- Health Check 只返回进程存活;
- Shutdown 立即杀进程,留下未 ACK 消息和半完成副作用;
- 只测正常路径,不做故障注入和恢复验证。
设计检查表
- 端到端 Deadline 可传播并被下游尊重。
- Error Classification、Retry Budget 和 Jitter 明确。
- 所有可重试副作用具备幂等边界。
- 线程池、连接池、队列和 Agent 并发有隔离与上限。
- Fallback 的能力、质量和用户提示明确。
- Readiness、Liveness、Shutdown 和恢复经过测试。
- Metrics / Trace 能证明策略确实生效。