背压

当下游处理能力不足时,向上游反馈并降低生产速率,使系统在过载下保持稳定;手段包括队列水位控制、拉模式消费与明确的拒绝策略。

什么是背压

背压指当下游处理能力不足时,向上游反馈并降低生产速率,使系统在过载下保持稳定。它的核心不是「扛住更多流量」,而是让流速与处理能力匹配:手段包括队列水位控制、拉模式消费、协议级流控与明确的拒绝策略。没有背压的过载系统通常以雪崩收场。

基本信息

触发信号队列积压、处理延迟上升、资源水位接近上限
实现手段消费者拉取模式、动态调节生产速率、分区暂停与限速
兜底策略超过上限时明确拒绝并告警,避免无限积压
协议支持TCP 滑动窗口、Reactive Streams 的 request(n)、gRPC 流控、消息消费配额

分层落地要点

  • 入口层:令牌桶或漏桶限流,超出容量的请求快速拒绝并给出重试建议
  • 链路层:消费者采用拉模式,按自身处理能力领取任务,而不是被动推送
  • 队列层:设置积压水位与上限,触发暂停、限速或扩容动作
  • 反馈层:返回 429 或 503 并附 Retry-After,让上游感知节奏而非静默堆积
  • 观测层:积压量、积压时长、拒绝率与处理延迟纳入监控与告警
  • 组合使用:入口限流保护自身,背压反馈保护下游,按链路分层配置

背压信号与处理(示意)

背压信号与处理(示意)
# 消费端按能力领取(拉模式)
while running:
    if 本地待处理数 >= 上限: 暂停领取,等待处理完一批   # 背压信号
    else: 领取一批任务 -> 处理 -> 确认

# 队列水位策略
积压 < 阈值: 正常消费
积压 >= 阈值: 触发扩容 / 降低生产速率 / 按业务等级丢弃低优先级消息

# 对外反馈
上游超速时返回 429 或 503,并在响应中给出建议重试间隔

典型手段与适用位置

手段适用位置注意点
限流入口网关与服务阈值需按实测容量设定
拉模式消费消息消费者避免推送模式下无限缓冲
队列水位控制中间队列水位阈值与扩容动作要联动
拒绝与降级服务边界必须给出明确错误码与重试建议
无界队列属于伪背压:积压只是被隐藏,延迟无上限增长,最终会以内存溢出或超时风暴的形式集中爆发。
只在入口限流而内部链路没有背压,中间层会先崩溃:入口看似受控,内部异步队列仍在无限积压。

易错点

  • 用无界队列承接流量,积压被隐藏,最终内存溢出或集中超时
  • 只在入口限流,内部链路无背压,中间队列先被压垮
  • 拒绝时不给重试建议,客户端立即重试形成重试风暴
  • 背压信号没有监控,积压时长失控后才由用户投诉发现

数据来源与参考

  • Reactive Streams 规范
  • Google SRE Book:Handling Overload
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌