1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| 当生产数据的速率远高于消费数据的速率 消费端丢弃新到达的数据 消费端的接收buffer持续扩张,最终耗尽消费端内存
静态限速 限制住生产端的速率与消费端保持一致 通常无法事先预估消费端能承受的最大速率 消费端承受能力通常会动态的波动
动态反馈/自动反压 负反馈 接收速率小于发送速率时发生 正反馈 发送速率小于接收速率时发生 Storm和SparkStreaming都有反压机制 Flink1.5之前没有反压机制,为什么? TCP天然具备feedback流控机制,Flink基于它来实现反压
TCP流控:滑动窗口方式 发送端初始3packets每秒 消费端1packets每秒,window固定为5 第一次 P:[123]456789 C:[12345]6789 #接收到123,窗口还剩2个 第二次 P:123[456]789 C:1[23456]789 #消费了1,窗口还剩3个,刚好接收456 第三次 P:123456[7]89 C:12[34567]89 #消费了2,窗口还剩1个,限定发送端速率降为1 第四次 P:1234567[]89 #定期发送zeroWindowProbe探测消息 C:12[34567]89 #消费端出现问题,速率降为0了,发送端也会降为0
对应在Flink中 Buffer被分为两种 InputGate(InputChannel) 接收Buffer ResultPartition(ResultSubPartition) 发送Buffer 跨TaskManager,反压如何从IC传播到RS TaskManager内,反压如何从RS传播到IC
|