云原生弹性设计
云原生弹性设计模式:Timeout、Retry、Idempotency、Circuit Breaker、Rate Limit、Backpressure、Graceful Degradation。
#type / concept
#status / growing
#tech / ops
[!info] related notes
- 所属 MOC: 云原生 MOC
- 前置概念: cloud-native-development
- 并列概念: twelve-factor-app, cloud-native-security
- 相关: go-health-check-endpoint, Observability Engineering MOC
云原生弹性设计
一句话定义
云原生应用要默认接受一个事实:任何东西都会失败。 弹性设计就是在故障发生时,系统能继续提供核心能力,而不是整体崩溃。
为什么需要弹性设计?
服务会挂、网络会抖、数据库会慢、模型 API 会超时、消息会重复、Pod 会被重启、节点会下线、用户会刷新页面、SSE 会断开。
对 AI Agent 应用尤其重要:LLM 调用慢、贵、不稳定,而且工具调用链路很长。
七种弹性模式
1. Timeout(超时)
定义: 所有远程调用都必须设置最大等待时间。不设超时 = 一个慢服务拖死整个系统。
实践:
- HTTP 调用:连接超时 5s,读取超时 30s
- LLM 调用:根据模型和任务复杂度设 30-120s
- 数据库查询:设合理的 statement_timeout
- SSE 连接:设最大连接时长
2. Retry(重试)
定义: 短暂失败可以重试,但必须控制次数和退避策略。
实践:
- 最大重试 3 次
- 指数退避(exponential backoff):1s → 2s → 4s
- 加随机抖动(jitter),避免雷群效应
- 只对可重试的错误重试(5xx、超时),不对 4xx 重试
- 重试必须配合幂等设计
3. Idempotency(幂等)
定义: 重复请求不能导致重复扣费、重复创建任务、重复写脏数据。
实践:
- 请求携带唯一 idempotency_key
- 服务端先查 key 是否已处理
- 数据库用唯一约束防重复
- AI Agent 的 Run 用 run_id 做幂等
4. Circuit Breaker(熔断)
定义: 某个依赖持续失败时,暂时停止调用,避免拖垮整个系统。
三状态:
- Closed(正常):正常放行请求
- Open(熔断):直接返回降级结果,不调用下游
- Half-Open(半开):放少量请求试探,成功则恢复,失败则继续熔断
适用场景: LLM API 持续超时、数据库连接池耗尽、第三方服务不可用。
5. Rate Limit(限流)
定义: 防止单个用户或异常流量打爆服务。
策略:
- 令牌桶(Token Bucket):允许突发流量
- 漏桶(Leaky Bucket):平滑流量
- 滑动窗口(Sliding Window):精确控制时间窗口内的请求数
AI Agent 场景: 限制单用户 LLM 调用频率、限制并发 Run 数量。
6. Backpressure(背压)
定义: 下游处理不过来时,上游要减速或排队。
实践:
- 消息队列满时,生产者阻塞或丢弃
- SSE 推送速度超过消费者处理速度时,缓冲或丢弃
- LLM 流式输出时,控制背压避免内存暴涨
7. Graceful Degradation(优雅降级)
定义: 核心功能优先,非核心功能可以临时关闭。
AI Agent 降级策略:
- LLM 不可用 → 使用缓存的回复或预设话术
- RAG 检索失败 → 跳过知识增强,直接用 LLM 回答
- 图片 OCR 失败 → 提示用户手动输入
- 非核心工具调用失败 → 跳过该工具,继续流程
AI Agent 弹性设计要点
| 环节 | 风险 | 弹性手段 |
|---|---|---|
| LLM 调用 | 超时、限流、返回错误 | 超时 + 重试 + 熔断 + 降级 |
| 工具调用 | 执行失败、返回异常 | 幂等 + 重试 + 跳过 |
| SSE 流式 | 连接断开 | 断线恢复 + 事件重放 |
| 向量检索 | 超时、无结果 | 超时 + 降级到关键词检索 |
| 任务队列 | 消费慢、积压 | 背压 + 限流 + 扩容 |