什么是过载保护
过载保护(load shedding)是在系统容量被击穿之前主动丢弃或降级低价值请求的机制。它承认一个前提:资源耗尽时全部请求一起变慢,比丢一部分请求更糟——排队会占满线程、连接与内存,最后连核心业务都不可用。做法是按优先级给请求分类,宁可让旁路请求快速失败,也要保住核心链路的成功率与延迟。
基本信息
| 适用场景 | 突发流量、依赖故障、容量交付延迟期间的在线服务 |
|---|---|
| 关联机制 | 限流(事前配额)、熔断(依赖隔离)、排队(缓冲)、自动扩容(恢复容量) |
| 判定依据 | 在途请求数、队列等待时长、线程池与连接池占用、CPU 与内存水位 |
| 返回语义 | 429 表示被限流或丢弃、可稍后重试;503 表示依赖或服务不可用 |
典型使用场景
- 大促与秒杀:核心下单请求优先,推荐位与埋点上报直接丢弃
- 下游依赖变慢:等待已超预算的请求提前失败,避免线程池被整条链路拖住
- 数据库连接池接近耗尽:拒绝旁路查询,保住写入路径
- 容量交付期或灰度期间:新集群容量未到位时按比例削峰
- 批量任务与在线流量争抢资源:让批量任务排队或推迟到低峰
过载信号与动作
| 信号 | 参考阈值 | 动作 |
|---|---|---|
| 在途请求数 | 超过实测容量的 80%~90% | 拒绝低优先级请求 |
| 队列等待时长 | 超过请求的超时预算 | 立即返回可重试响应 |
| 线程池或连接池占用 | 持续贴近上限 | 关停旁路功能、缩短调用超时 |
| 下游错误率 | 超过熔断阈值 | 熔断该依赖并走降级返回 |
丢弃判定(伪代码)
丢弃判定(伪代码)
if inflight >= capacity * 0.9: # 接近饱和
if priority(req) == LOW: return 429(retry_after=1s)
if queue_wait(req) > timeout_budget: # 排队超预算
return 503(降级内容)
else: 正常入队
# 丢弃计数按接口与优先级打点,并触发过载告警实施要点
- 分级先于丢弃:与业务确认核心、重要、可降级三级清单,落到配置而非散落在代码分支里
- 丢弃面要小于受损面:只丢旁路与可降级流量,核心链路宁可排队也不能误伤
- 返回可重试语义与建议退避时间,抑制客户端的无效重试
- 丢弃计数按接口与优先级打点,作为触发自动扩容与降级开关的联合信号
- 与限流互补:限流在入口按配额拦截,过载保护在内部按实时负载兜底
阈值要按容量实测设定,而不是照抄比例:先压测出单实例的容量拐点(延迟开始非线性上升的那个点),再把丢弃阈值放在拐点以下的一段水位。
过载保护在监控上表现为错误率上升:必须把“主动丢弃的 429/503”与“真实故障错误”分开计数与告警,否则丢流量保稳定的动作会被当成事故处理。