使用EmitEarlywhenFull()对滚动窗口进行抑制的工作原理是什么?

时间:2019-04-15 10:21:25

标签: apache-kafka apache-kafka-streams

我在滚动窗口上使用抑制以获得汇总结果。我正在探索untilTimeLimit和untilWindowCloses进行抑制。 我不希望在缓冲区已满时关闭流。我已经看到了此功能emitEarlyWhenFull(),但是它不能应用到untilWindowCloses之上。 因此,我选择带有EmitEarlyWhenFull()的untilTimeLImit,请参考以下代码:

groupedStreams.windowedBy(TimeWindows.of(Duration.ofMinutes(5)))    
.aggregate(() -> initialBlob, blobAggregator,someserde)
.suppress(Suppressed.untilTimeLimit(Duration.ofMinutes(5), new StrictBufferConfigImpl().emitEarlyWhenFull()))
.toStream()

就我而言,我正在使用滚动窗口5分钟。因此,每5分钟,将为每个记录键打开一个窗口。根据文档,最旧的记录将在缓冲区被填充时发送。 在同一翻滚窗口中向下发送旧记录之后,使用相同密钥的新记录会发生什么?

例如:消息流: (A,1) (A2) (A,3)-> agg结果:(A,6)。假设这里缓冲区已满,(A,6)将向下游发送。假设(A,4)现在在同一翻滚窗口中,接下来会发生什么?是(A,10)还是重新以(A,4)重新开始?

1 个答案:

答案 0 :(得分:0)

如果suppress()发出,状态将被保留。因此,以您的示例为例,聚合将继续进行,最终将发出(A,10)。