卡夫卡流。窗口宽限期关闭后,按键获取按时间顺序排列的事件流

时间:2020-10-01 20:20:31

标签: apache-kafka apache-kafka-streams

我的用例涉及我的应用程序接收事件,我们可以期望其中一些事件是按时间顺序到达的(“事件”时间后最多2天),这些事件需要按键分组。我不想汇总记录,而只是一次获得这些事件时间窗口的有序列表。我怀疑使用聚合函数来构建事件列表是否可行,因为每个键/时间窗口可能有数千个事件,因此我很可能会得到RecordTooLargeException。

我玩过的代码创建了一个具有2天宽限期的翻滚窗口-原则上可以工作,但需要我使用汇总-并且我觉得构建消息列表的用例超出了汇总功能原本打算用于-例如

stream.stream[Key, Entry](inputTopic)(Consumed.`with`[EntryKey, Entry](timestampExtractor))
      .groupByKey(Grouped.`with`(keySerde, valueSerde))
      .windowedBy(TimeWindows.of(windowSize).grace(windowGrace))
      .aggregate[EntryGroup](
        EntryGroup(Seq.empty[Entry])
      )((_: EntryKey, newValue: Entry, aggregate: EntryGroup) => EntryGroup(aggregate.anprEntries :+ newValue))
      .suppress(Suppressed.untilWindowCloses(Suppressed.BufferConfig.unbounded()))

是否有一种惯用的方式来传递键/时间窗的下游有序事件组,而不会遇到记录大小问题?

1 个答案:

答案 0 :(得分:1)

我建议回退到处理器 API:使用 WindowStore(启用 allowDuplicates)允许您缓冲所有记录(存储中每“行”一个记录)。

因此,您可以将传入的记录放入存储中,并随着时间的推移从存储中发出“旧记录”(并从存储中删除它们)。