什么是背压
背压指当下游处理能力不足时,向上游反馈并降低生产速率,使系统在过载下保持稳定。它的核心不是「扛住更多流量」,而是让流速与处理能力匹配:手段包括队列水位控制、拉模式消费、协议级流控与明确的拒绝策略。没有背压的过载系统通常以雪崩收场。
基本信息
| 触发信号 | 队列积压、处理延迟上升、资源水位接近上限 |
|---|---|
| 实现手段 | 消费者拉取模式、动态调节生产速率、分区暂停与限速 |
| 兜底策略 | 超过上限时明确拒绝并告警,避免无限积压 |
| 协议支持 | TCP 滑动窗口、Reactive Streams 的 request(n)、gRPC 流控、消息消费配额 |
分层落地要点
- 入口层:令牌桶或漏桶限流,超出容量的请求快速拒绝并给出重试建议
- 链路层:消费者采用拉模式,按自身处理能力领取任务,而不是被动推送
- 队列层:设置积压水位与上限,触发暂停、限速或扩容动作
- 反馈层:返回 429 或 503 并附 Retry-After,让上游感知节奏而非静默堆积
- 观测层:积压量、积压时长、拒绝率与处理延迟纳入监控与告警
- 组合使用:入口限流保护自身,背压反馈保护下游,按链路分层配置
背压信号与处理(示意)
背压信号与处理(示意)
# 消费端按能力领取(拉模式)
while running:
if 本地待处理数 >= 上限: 暂停领取,等待处理完一批 # 背压信号
else: 领取一批任务 -> 处理 -> 确认
# 队列水位策略
积压 < 阈值: 正常消费
积压 >= 阈值: 触发扩容 / 降低生产速率 / 按业务等级丢弃低优先级消息
# 对外反馈
上游超速时返回 429 或 503,并在响应中给出建议重试间隔典型手段与适用位置
| 手段 | 适用位置 | 注意点 |
|---|---|---|
| 限流 | 入口网关与服务 | 阈值需按实测容量设定 |
| 拉模式消费 | 消息消费者 | 避免推送模式下无限缓冲 |
| 队列水位控制 | 中间队列 | 水位阈值与扩容动作要联动 |
| 拒绝与降级 | 服务边界 | 必须给出明确错误码与重试建议 |
无界队列属于伪背压:积压只是被隐藏,延迟无上限增长,最终会以内存溢出或超时风暴的形式集中爆发。
只在入口限流而内部链路没有背压,中间层会先崩溃:入口看似受控,内部异步队列仍在无限积压。