推理服务扩容要分钟级,但流量暴增可能秒级——营销活动、产品爆红、突发事件都可能在几分钟内把流量推到平时的几十倍。如果没有限流降级,超载会让所有用户体验崩塌,引发雪崩。这一节讲清「扛不住时怎么保命」。
LLM 推理服务面对的大流量冲击有几类:
冲击的核心问题是「容量跟不上流量」——扩容要分钟级,冲击是秒级,必然有「容量缺口」。这个缺口期间,必须靠「限流降级」保护系统不崩溃。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 280" font-family="sans-serif" font-size="12"> <text x="360" y="22" text-anchor="middle" font-size="15" font-weight="bold">大流量冲击下的容量缺口</text> <!-- 流量曲线 --> <path d="M 40 220 Q 150 220 200 80 L 400 80 Q 500 80 680 220" fill="none" stroke="#dc2626" stroke-width="3"/> <text x="600" y="100" font-size="11" fill="#dc2626">流量(突发)</text> <!-- 容量曲线 --> <path d="M 40 220 L 200 220 Q 280 220 350 180 L 500 130 L 680 100" fill="none" stroke="#16a34a" stroke-width="3"/> <text x="600" y="135" font-size="11" fill="#16a34a">容量(扩容滞后)</text> <!-- 缺口区域 --> <path d="M 200 80 L 400 80 L 350 180 Q 280 220 200 220 Z" fill="#fee2e2" opacity="0.7"/> <text x="280" y="160" text-anchor="middle" font-size="11" fill="#dc2626" font-weight="bold">容量缺口</text> <text x="280" y="180" text-anchor="middle" font-size="10" fill="#dc2626">→ 需要限流降级保护</text> <text x="360" y="255" text-anchor="middle" font-size="11" fill="#475569">扩容慢、流量快,缺口期间靠限流降级保命</text> </svg>
💡 判读:大流量稳定性的核心是「承认扛不住」——不要幻想能扩容赶超突发流量,而要预设「会有容量缺口」,用限流降级让系统在缺口期间「优雅劣化」而非「崩溃雪崩」。
限流(Rate Limiting) 是大流量保护的第一道防线。它的核心是「控制单位时间处理的请求数」,超出的请求被拒绝或排队。
主流限流算法:
令牌桶数学: 令牌按速率 R 入桶,桶容量 C 请求消耗 1 令牌 长期平均速率 ≤ R,短时突发 ≤ C
| 算法 | 突发 | 平滑度 | 复杂度 | 典型用途 |
|---|---|---|---|---|
| 令牌桶 | 允许 | 中 | 低 | 服务级限流(最常用) |
| 漏桶 | 不允许 | 高 | 中 | 严格平滑 |
| 滑动窗口 | 可控 | 高 | 中 | 用户/IP 级限流 |
LLM 服务常需要多维度限流:
被限流的请求不一定要立即拒绝,可以排队等待。这需要:
不同请求设不同优先级,高优先级先处理:
| 优先级 | 用户类型 | 处理 |
|---|---|---|
| P0 | 付费 VIP | 立即处理 |
| P1 | 付费普通 | 优先处理 |
| P2 | 免费用户 | 排队处理 |
| P3 | 内部测试 | 容量允许才处理 |
这种「优先级分层」让有限容量优先服务高价值用户,是大流量期间的常见策略。
排队不是免费的——它把「拒绝」换成「等待」,但等待过长用户体验仍差。生产中要:
当限流不够、排队也满时,最后一道防线是「降级(Degradation)」——用更便宜的方式响应,保证「有响应」而非「无响应」。
LLM 推理服务的降级策略:
主模型(如 70B)撑不住时,路由到小模型(如 7B):
💡 判读:降级的核心哲学是「优雅劣化(Graceful Degradation)」——承认在极端情况下无法保证最优体验,但保证「可用性」。这比「直接崩溃」对用户友好得多。降级要预先设计、自动化触发,不能临时人工决策。
熔断器(Circuit Breaker) 模式来自电气工程——电流过大时保险丝熔断,保护电路。在软件中,熔断器监控对依赖的调用,失败率超阈值时「熔断」(停止调用),一段时间后「半开」(试探性调用),成功则「闭合」(恢复调用)。
LLM 服务中熔断的应用:
熔断的三个状态:
| 状态 | 行为 | 转换条件 |
|---|---|---|
| Closed(闭合) | 正常调用 | 失败率 > 阈值 → Open |
| Open(断开) | 直接拒绝/降级 | 等待 timeout → Half-Open |
| Half-Open(半开) | 试探性调用 | 成功 → Closed,失败 → Open |
雪崩(Cascading Failure) 是大流量最可怕的后果——一个组件超载,导致依赖它的组件也超载,连锁崩溃。LLM 推理服务的雪崩路径:
流量突增 → 推理 Pod 排队 → Pod 内存/CPU 飙升 → Pod OOM/重启 → 副本数减少 → 剩余副本负载更高 → 更多副本崩溃 → 雪崩
防止雪崩的几个机制:
下游撑不住时,主动告诉上游「慢点发」,而非「全收下然后崩」。LLM 服务的背压:
把资源按用途隔离,互不影响:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 280" font-family="sans-serif" font-size="12"> <text x="360" y="22" text-anchor="middle" font-size="15" font-weight="bold">雪崩与防护</text> <!-- 雪崩路径 --> <rect x="40" y="50" width="640" height="80" rx="6" fill="#fee2e2" stroke="#dc2626"/> <text x="60" y="75" font-weight="bold" fill="#991b1b">雪崩路径(无防护):</text> <text x="60" y="95" font-size="11">流量突增 → 排队 → Pod 超载 → OOM/重启 → 副本减少 → 剩余超载 → 全面崩溃</text> <text x="60" y="115" font-size="11" fill="#dc2626" font-style="italic">连锁反应,雪球越滚越大</text> <!-- 防护机制 --> <rect x="40" y="150" width="640" height="120" rx="6" fill="#dcfce7" stroke="#16a34a"/> <text x="60" y="175" font-weight="bold" fill="#15803d">防护机制(4 道):</text> <text x="60" y="197" font-size="11">1. 限流(令牌桶)→ 控制入口流量</text> <text x="60" y="217" font-size="11">2. 排队 + 超时 → 让等待有上限</text> <text x="60" y="237" font-size="11">3. 熔断 → 切断故障依赖</text> <text x="60" y="257" font-size="11">4. 背压 + 舱壁 + 容量预留 → 阻断连锁</text> </svg>
把上述机制组合,一个生产级 LLM 推理服务的稳定性架构:
这套架构实现了「入口限流 + 队列优先级 + 熔断保护 + 多级降级 + 自动扩缩」的完整稳定性保障,是大流量 LLM 服务的标准设计。
稳定性策略设计得再好,也要主动验证——否则真出事时才发现漏洞。混沌工程(Chaos Engineering) 通过主动注入故障,验证系统的稳定性。
LLM 服务的混沌实验:
| 故障注入 | 验证 |
|---|---|
| 杀 Pod | K8s 自愈、扩容响应 |
| 拉高流量 10x | 限流、降级触发 |
| 模拟 GPU 故障 | 多副本接管 |
| 网络延迟/丢包 | 超时、重试 |
| 依赖服务下线 | 熔断触发 |
| 模型加载失败 | 副本健康检查 |
著名的混沌工程工具:
💡 判读:混沌工程的核心理念是「主动制造故障」而非「被动等待故障」。通过常态化的小规模混沌实验,在故障真正发生前发现并修复稳定性漏洞。Netflix 的 Chaos Monkey 是这一实践的鼻祖,AI 服务同样适用。
落地稳定性的几个工程实践:
下一节《8.4 综合案例与未来展望》将用综合案例把全书四层架构串联,并展望未来趋势。