背压是什么
背压(反压)是流处理链路的自我保护机制:当下游算子处理速度低于上游发送速度时,压力会沿数据流向逆着往上传递,最终让源端减速。它本身不是故障,而是「链路某处已经满载」的信号。真正需要处理的是持续存在的反压——那说明某个算子或外部写入长期跟不上,不定位清楚就扩容,往往只是把压力转移到更脆弱的下游。
基本信息
| 诱因 | 算子耗时长、外部写入慢、数据倾斜 |
|---|---|
| 表现 | 消费滞后持续增长、反压指标升高 |
| 处理手段 | 扩容并行度、批量写、消除热点 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 趋势),再看算子指标,最后才动参数。反过来先调并行度,容易把问题掩盖成一段时间后更严重的堆积。