首页/开发/系统分析与架构设计速查/过载保护与流量丢弃

过载保护与流量丢弃

当负载超过容量时主动丢弃低优先级流量:按优先级分类请求,先保核心链路,丢弃或排队旁路请求,并快速返回可重试的错误。

什么是过载保护

过载保护(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”与“真实故障错误”分开计数与告警,否则丢流量保稳定的动作会被当成事故处理。

易错点

  • 无差别丢弃:核心交易与埋点上报同等对待,结果丢掉了收入却没保住稳定
  • 错误码不分级:客户端把 429 当故障反复重试,反而放大了过载
  • 阈值靠拍脑袋:设得过高在过载时不起作用,设得过低会在正常波动下开始丢量
  • 只丢不扩:过载信号没有联动自动扩容或降级开关,丢弃窗口被拖得很长
  • 优先级判定依赖请求体字段,过载时解析请求本身又要耗资源,判定应在网关或接入层尽早完成

数据来源与参考

  • Google SRE Book:Handling Overload
  • AWS Well-Architected Framework:Reliability Pillar
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌