本节摘要:反压告警是流量峰值的头号考题。本节用一起"零点峰值反压雪崩"做完整标本,走一遍从发现拥堵、逐级回溯、火焰图锁定热点,到降级止血与根治复盘的全流程。读完你应能把第 2.3 节的物理原理兑现成一套十分钟的处置肌肉记忆。
大促零点,成交洪峰如约而至。值班群在峰值开始后不久弹出告警:主链路作业反压持续三分钟。打开监控大盘,读数与第 6.3 节的体系严丝合缝:作业层流入记录数还在涨、流出已停滞;算子层的反压视图里,标红从 Sink 一路蔓延到窗口聚合;检查点层最近两次快照失败。业务侧暂时无感——大屏数字慢了约一分钟,但离"停更"还有缓冲。按预案,这是 P2 性能病,走反压急救程序。
急救的第一动作不是改配置,是找拥堵节。打开作业图的反压视图,读法遵循 2.3 节的口诀:从 Sink 往 Source 找第一个"高繁忙且高反压"的算子。视图给出的答案是窗口聚合的某几个子任务:繁忙度贴顶,其余实例却闲得发慌——吞吐分布陡然分化,数据倾斜的典型脸型(第 8 章的倾斜治理在此提前登场)。进一步看这几个繁忙子任务的 key 分布统计:头部商户的键流量是均值的百倍。拥堵节的初判:热键把少数窗口子任务压垮,反压由此逐级上传。
热键解释了"谁忙",还没解释"忙在哪"。如果只是数据多,横向打散即可;但如果算子本身有热点(比如某个外部调用在高峰期变慢),打散只是把灾难复制成多份。这时需要火焰图:从 Web UI 的作业页面触发火焰图采样(引擎在反压时会自动对卡在收数据的线程采样,把线程栈聚合成调用树),看CPU时间都烧在哪一层。当时的火焰图给出了教科书级的答案:大量时间耗在一个 Map 函数里的外部特征查询——它给每笔交易同步调用风控特征服务,平时三十毫秒的接口在零点被上游服务拖到八百毫秒,这个 Map 虽然不在倾斜的窗口层,却是整条链路真正的"最窄管径"。

定位清楚,止血讲究"先保主干、再论优雅"。动作一:拓宽窄管径。给特征查询加本地缓存(每实例一个有界 LRU,容量十万条),零点场景下商户特征高度重复,缓存命中率九成,同步调用的等待时间当场塌缩。动作二:主动降级。与业务方约定的降级开关拉下——高峰期非关键品类跳过特征 enrich,只保留成交主链路。降级不是认输,是用口径的临时缩水换主干指标的存活,前提是开关与口径口径事先演练过、业务方知情。二十分钟后流出恢复、反压退红、检查点复绿,急救结束。
节后按处方根治:特征查询重写为异步算子(AsyncFunction),并发请求数、超时、降级路径显式声明——同步阻塞的反模式从代码里消失;热键按订单号后缀加盐打散,窗口内二次归并,倾斜归零(手法细节在第 8.3 节展开)。复盘沉淀两条反压预案入册:其一,任何同步外部调用进 Flink 作业,必须回答"高峰劣化多少倍、有没有缓存与降级";其二,keyed 聚合上线前必须跑键分布预估,头部键流量超过均值十倍就先做打散设计。
急救之外,把常见错误动作列成反面清单,比正面清单更防身。反模式一:一见反压就扩容。倾斜或慢调用造成的反压,加机器只是把拥堵摊薄到更多实例,病根分文未动,成本先翻倍。反模式二:上来就开非对齐快照当日常。非对齐是心跳的救急通道,不是性能优化;常态开启会让快照体积与恢复时间长期承压。反模式三:盲目调大网络缓冲。缓冲变多只会推迟拥堵的出现时间,吞吐上限由瓶颈的消化能力决定;缓冲调大的正确场合只有一种——诊断确认缓冲本身不足(2.3 的齐忙脸谱)。反模式四:重启大法。重启清空的是缓冲区队列,不清空瓶颈;作业爬起来的那一刻,反压会在同样的位置重新长出来,还搭上一次恢复开销。反模式五:把告警阈值调高装看不见。反压不治理不会自愈,只会积累成检查点失败、状态膨胀、最终停更的复合事故——阈值调高的那一刻,事故只是改了名字叫"突发"。
五条反模式共享同一个病根:把反压(症状)当成了病(瓶颈)本身。处置链的第一步永远是定位瓶颈的名字,名字没叫出来之前,任何动作都只是安慰剂。
大促零点是反压的旺季,但值班经验里还有一类"淡季反压"更迷惑人:流量低谷期反压反而冒头。一起真实案例:每天凌晨反压告警准时响起,天亮自愈。排查路径与高峰反压完全不同——流量小、无倾斜、无慢调用,最终在火焰图里找到答案:某定时任务每凌晨触发一次全量维表刷新,刷新期间维表服务的响应劣化,作业里那次维表查询的耗时随之暴涨。淡季反压的教训是:瓶颈不一定在数据量里,也可能在"时间的约定"里——上游的定时批任务、缓存集中过期、数据库的夜间备份,都会在低谷期制造出比高峰更尖锐的慢点。处置:维表查询加本地缓存拉长刷新间隔,并与上游团队把刷新窗口错开到作业空闲时段。给值守手册补一条:反压告警出现明显的时刻规律时,先去排查"那个时刻全公司还有什么定时任务",比盯着自己的作业看有效得多。
本节收尾把急救链压成一张口袋卡:告警三分钟定性(性能病还是故障病)、反压视图找拥堵节、火焰图叫出热点名字、缓存与降级先止血、根治排期写复盘。五个动作五句话,贴在工位上,下次告警响起时照着走。
另一条补充给多作业共享集群的值守者:反压告警要分辨"作业自身瓶颈"与"邻居挤压"两种来源——同宿主作业的快照高峰或某作业的流量突刺,都可能把邻居顶进反压。分辨方法也简单:查自己的瓶颈链无果时,看同宿主其他作业的指标曲线,相关性一目了然。这也是 6.1 节力推单作业型部署的又一个理由:隔离掉的不仅是资源,还有排错时的干扰项。
第 6 章收官。作业稳了,该盘一盘数据的血管网络:第 7 章讲生态与连接器——数据从哪来、到哪去。