出于某种原因,保留策略到期后,我的旧状态存储未清除。我正在本地进行测试,因此每5分钟左右发送一次测试消息。我将保留期限设置得较低,仅用于测试。 tentionPeriod = 120,retentionWindowSize = 15,我认为保留重复项应为false。什么时候该是真的?
Stores.persistentWindowStore(storeName,
Duration.of(retentionPeriod, ChronoUnit.SECONDS),
Duration.of(retentionWindowSize, ChronoUnit.SECONDS),
false)
当我进入状态存储目录时,在保留期限到期后,我会很好地看到旧存储。例如,store.1554238740000(假设数字为纪元ms)。我已经过了2分钟的保留时间,该目录仍然存在。
我想念什么?
注意,它最终确实比我期望的晚很多。是什么触发清理的?
答案 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
通过了保留期(即使数据仍然存在,因为该段仍在使用中)。