背压是什么
背压是把不可控的堆积变成可控的拒绝。下游变慢时,上游若无背压就会不断堆积:请求排队、内存上涨、超时触发重试,压力被进一步放大,最终应用比 Redis 先崩。做法是在入口限流、用有界队列替代无界队列、必要时熔断并降级到本地缓存或默认值,同时把拒绝数量纳入监控。
基本信息
| 核心手段 | 有界队列、入口限流、熔断降级 |
|---|---|
| 降级方式 | 本地缓存或默认值兜底 |
| 观测项 | 队列长度、拒绝数量、降级比例 |
| 设计原则 | 把不可控的堆积变成可控的拒绝 |
| 配套动作 | 超时与重试策略同时收紧 |
典型使用场景
- 突发流量:入口限流把超出容量的部分挡在业务之外
- 依赖故障:下游不可用时熔断,避免请求堆积拖垮自身
- 缓存击穿:降级到本地缓存或默认值,保证核心链路可用
- 批任务与在线混跑:给批任务单独队列,避免互相挤占
- 容量评估:用拒绝量反推真实需求,作为扩容依据
落地要点示意
落地要点示意
# 队列有界:满时立即失败并返回降级结果
# 入口限流:按 QPS 上限控制放行量
# 熔断:连续失败达到阈值后快速失败一段时间
# 观测:拒绝量、队列长度、降级比例都进监控
# 恢复:熔断进入半开状态探测,确认下游可用后再放量落地检查项
| 检查项 | 要求 | 不满足的后果 |
|---|---|---|
| 队列是否有界 | 满了快速失败 | 无界队列吃光内存,应用先崩 |
| 拒绝是否计数 | 进监控与告警 | 容量问题长期无人发现 |
| 降级是否有标记 | 返回体带降级标识 | 业务把默认值当真值使用 |
| 熔断能否恢复 | 半开探测后自动恢复 | 长期熔断导致能力闲置 |
背压的目标不是拒绝请求,而是让系统在过载时仍能保住核心链路:非核心功能先降级,核心交易的资源优先保证。
降级返回的数据若不标记,业务侧会把默认值当真实数据继续计算,事后对账困难;降级标识要同时体现在接口返回值与日志里。