我们在kafka-streams中进行了一项开发,该开发产生了一种时间窗口聚合类型:
selectKey().groupByKey().aggregate()
然后使用
TimeWindows.of().until()
我的主要问题是,如果不使用until
,会发生什么情况,假设我们有1分钟的窗口,并且由于某些不可预见的原因,从1周前开始有一个新事件发生,应用程序是否保存了来自一开始?它是否会产生过多的内存消耗,或者在持久化所有窗口状态的情况下,是否不认为会延迟相当长的时间来恢复适当的窗口?
答案 0 :(得分:2)
我们最近遇到了同样的问题。可以在以下源文件中找到有关kafka流的答案:
其中包含:
static final long DEFAULT_MAINTAIN_DURATION_MS = 24 * 60 * 60 * 1000L; // one day
因此,在不指定until()
设置的情况下,默认情况下,您的窗口状态存储将保留一天(下限)的记录。
问题的另一部分是:在窗口过期之后,迟到的事件会发生什么?答案在开发人员指南中:
在Kafka Streams DSL用户中,可以为 窗口。这样一来,Kafka Streams可以保留旧的窗口时段,以便 为了等待其记录的延迟到达的时间段 时间戳落在窗口间隔内。如果之后有记录 保留期限已过,记录无法处理,并且 放下。
将这些信息组合在一起即可显示,如果您未在窗口流中指定until()
设置,则记录将保留至少一天,而到来晚于一天的记录将被删除。