首页/数据/数据工程与 ETL 速查/背压 Backpressure 与链路限速
管道基础52 条

背压 Backpressure 与链路限速

当下游处理速度低于上游时,反压沿链路向上传递,最终让源端减速;持续反压说明某算子或外部写入成为瓶颈,需要定位再扩容。

背压是什么

背压(反压)是流处理链路的自我保护机制:当下游算子处理速度低于上游发送速度时,压力会沿数据流向逆着往上传递,最终让源端减速。它本身不是故障,而是「链路某处已经满载」的信号。真正需要处理的是持续存在的反压——那说明某个算子或外部写入长期跟不上,不定位清楚就扩容,往往只是把压力转移到更脆弱的下游。

基本信息

诱因算子耗时长、外部写入慢、数据倾斜
表现消费滞后持续增长、反压指标升高
处理手段扩容并行度、批量写、消除热点 key
常见引擎Flink、Spark Streaming、Kafka 消费链路都有同类现象
观察入口作业 Web UI 的反压面板、火焰图、消费组 lag 曲线

排查顺序

排查顺序
1) 看消费组 lag 是否持续增长
2) 看算子反压与 busy 指标,定位到具体算子
3) 判断是计算慢还是 sink 慢(下游库、对象存储)
4) 再调并行度或写入批参数

典型使用场景

  • 作业上线后 lag 缓慢上涨:判断是新代码变慢还是流量确实增长了
  • 写入关系库报超时:通常是 sink 端连接池或单条写入过慢,反压只是表象
  • 大促期间突增流量:确认瓶颈位置后再决定扩容算子还是给下游加配额
  • 数据倾斜引发的局部反压:少数 subtask 忙、多数空闲,需要打散热点 key
  • 优化后效果验证:对比反压比例与 lag 趋势,确认调整真的起作用

现象与判断

现象可能原因动作
反压集中在一个算子该算子逻辑重或状态大优化逻辑、拆分算子或加并行度
反压出现在 sink外部库写入慢或限流批量写、加连接池、降写入频率
少数 subtask 忙、其余空闲数据倾斜打散热点 key 或加盐
lag 增长但算子不忙源端消费或提交环节有问题检查消费配置与分区分配
周期性反压外部系统定时任务抢占资源错峰调度或资源隔离
Flink Web UI 的反压面板与火焰图能快速定位热点算子,比先盲目调并行度省时间。
排查顺序建议从外向内:先确认消费端是否真的跟不上(lag 趋势),再看算子指标,最后才动参数。反过来先调并行度,容易把问题掩盖成一段时间后更严重的堆积。

易错点

  • 无脑加并行度可能让外部 sink 压力更大,先确认瓶颈在计算还是写出
  • 反压与数据倾斜常同时出现,先看各 subtask 的吞吐差异
  • 把持续反压当正常现象长期搁置,checkpoint 会越做越慢直至失败
  • 只看平均指标不看分位与分布,热点 subtask 的问题会被平均值抹平
  • 扩容后忘了同步调整下游连接数或写入配额,链路整体仍然堵在同一处

数据来源与参考

  • Apache Flink 官方文档:Back Pressure 监控
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌