先上一张图整体了解Flink中的反压
可以看到每个task都会有自己对应的IG(inputgate)对接上游发送过来的数据和RS(resultPatation)对接往下游发送数据, 整个反压机制通过inputgate,resultPatation公用一个一定大小的memorySegmentPool来实现(Flink中memorySegment作为内存使用的抽象,类比bytebuffer), 公用一个pool当接收上游数据时Decoder,往下游发送数据时Encoder,都会向pool中请求内存memorySegment 。因为是公共pool,也就是说运行时,当接受的数据占用的内存多了,往下游发送的数据就少了,这样是个什么样的情况呢?
比如说你sink端堵塞了,背压了写不进去,那这个task的resultPatation无法发送数据了,也就无法释放memorySegment了,相应的用于接收数据的memorySegment就会越来越少,直到接收数据端拿不到memorySegment了,也就无法接收上游数据了,既然这个task无法接收数据了,自然引起这个task的上一个task数据发送端无法发送,那上一个task又反压了,所以这个反压从发生反压的地方,依次的往上游扩散直到