首页 > 解决方案 > 使用 emitEarlywhenFull() 进行翻滚窗口的抑制是如何工作的?

问题描述

我在翻滚窗口上使用抑制来获得汇总结果。我正在探索 untilTimeLimit 和 untilWindowCloses 来抑制。我不希望我的流在缓冲区满时关闭。我已经看到了这个功能 emitEarlyWhenFull() ,但它不能适用于 untilWindowCloses。因此,我选择 untilTimeLImit 和 emitEarlyWhenFull() ,请参考下面的代码:

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) (A,2) (A,3) -> agg result : (A,6)。假设这里,缓冲区已满,(A,6) 将被发送到下游。让我们假设 (A,4) 现在出现在同一个翻滚窗口中,接下来会发生什么?会是 : (A,10) 还是会从 (A,4) 重新开始?

标签: apache-kafkaapache-kafka-streams

解决方案


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


推荐阅读