Apache kafka 卡夫卡流-抑制到窗口结束(不关闭)

Apache kafka 卡夫卡流-抑制到窗口结束(不关闭),apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我正在窗口流上执行聚合,希望抑制早期聚合结果。我所说的早期结果是指在窗口结束之前计算的结果,而不是那些在宽限期内发生的结果。因此,我希望使用timestamp=window end和timestamp

我正在窗口流上执行聚合,希望抑制早期聚合结果。我所说的早期结果是指在窗口结束之前计算的结果,而不是那些在宽限期内发生的结果。因此,我希望使用timestamp=window end和timestamp 最小Kafka流拓扑示例:

newstreamsbuilder()
.stream(“我的主题”)
.windowedBy(TimeWindows.of(MyWindowsSize.grace)(myGracePeriod))
.reduce(myReducer)
.suppress(/*搜索*/)
.toStream();
因此,
被抑制。直到Windows关闭(…)
对我来说不是一个选项,因为我必须等到宽限期到期,这可能会很长

根据,可以使用
Suppressed.untilTimeLimit(Duration.ZERO,…)
as(引用KIP的描述)获得所需的行为:

a在发出更新之前等待更多更新的时间。这是一个时间量,从事件时间(对于常规KTables)或从窗口端(对于窗口KTables)测量,在向下游发出之前缓冲每个键

但是,这意味着情况并非如此,时间限制在收到每个(加窗)键的第一条记录时开始倒计时,而不是在窗口结束时开始倒计时


我很高兴能澄清这一点,并支持如何实现所需的行为。

KIP描述不正确(我相应地更新了wiki页面)。请注意,在KIP的下一步,表示:

速率限制更新

假设我们希望将更新率从一个KTable降低到大约每30秒一次。我们不想为此使用太多的内存,而且我们不认为在任何时候都会有超过1000个密钥的更新

table
  .suppress(untilTimeLimit(Duration.ofSeconds(30), maxRecords(1000)))
  .toStream(); // etc.
因此,使用
untilTimeLimit
可以定期发射。对于窗口聚合,间隔计时器将在窗口开始时间启动——您仍然可以将等待时间设置为“窗口大小”以不获取任何“早期”更新,但在窗口结束后,您不会看到所有更新,而只能在“窗口大小间隔”中看到更新。如果你的宽限期真的很长,这可能仍然足够好


您描述的用例目前不受支持,但我认为这是一个非常有趣和有用的用例。也许您可以创建一个功能请求单?

非常感谢您的澄清!我将创建一个功能请求!我创建了相应的功能请求: