我的用例涉及我的应用程序接收事件,我们可以期望其中一些事件是按时间顺序到达的(“事件”时间后最多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()))
是否有一种惯用的方式来传递键/时间窗的下游有序事件组,而不会遇到记录大小问题?
答案 0 :(得分:1)
我建议回退到处理器 API:使用 WindowStore
(启用 allowDuplicates
)允许您缓冲所有记录(存储中每“行”一个记录)。>
因此,您可以将传入的记录放入存储中,并随着时间的推移从存储中发出“旧记录”(并从存储中删除它们)。