保留后,Kafka窗口式州立商店未清理

时间:2019-04-02 21:06:11

标签: apache-kafka-streams

出于某种原因,保留策略到期后,我的旧状态存储未清除。我正在本地进行测试,因此每5分钟左右发送一次测试消息。我将保留期限设置得较低,仅用于测试。 tentionPeriod = 120,retentionWindowSize = 15,我认为保留重复项应为false。什么时候该是真的?

Stores.persistentWindowStore(storeName,
                        Duration.of(retentionPeriod, ChronoUnit.SECONDS),
                        Duration.of(retentionWindowSize, ChronoUnit.SECONDS),
                        false)

当我进入状态存储目录时,在保留期限到期后,我会很好地看到旧存储。例如,store.1554238740000(假设数字为纪元ms)。我已经过了2分钟的保留时间,该目录仍然存在。

我想念什么?

注意,它最终确实比我期望的晚很多。是什么触发清理的?

1 个答案:

答案 0 :(得分:0)

保留时间是确保数据存储多长时间的最低保证。为了使到期有效,使用所谓的段将时间线划分为“存储桶”。仅在段中所有数据的时间都可以到期之后,才删除该段。默认情况下,Kafka Streams使用3段。因此,对于您的示例,保留时间为120秒,每个段将为60秒(而不是40秒)。原因是最早的段只能删除 all 数据,因为保留时间已过。如果段大小仅为40秒,则需要4个段来实现:

S1 [0-40) -- S2 [40,80) -- S3 [80,120)

如果应该存储带有时间戳记121的记录,则S1不能被删除,因为它包含尚未通过保留期的时间戳记1到40的数据。因此,将需要新的段S4。对于段大小60,三个段就足够了:

S1 [0-60) -- S2 [60,120) -- S3 [120,180)

在这种情况下,如果到达时间戳为181的记录,则第一段中的所有数据都将经过保留时间181-120 = 61,因此可以在创建S4之前删除S1。

请注意,自Kafka 2.1起,内部机制仍然相同,但是,Kafka Streams以严格的方式在应用程序级别强制执行保留期,即,对于所有数据,写入均被丢弃,读取返回null通过了保留期(即使数据仍然存在,因为该段仍在使用中)。