在Kafka Streams 2.0中。
我的用例:能够从历史处理的开始就(从历史数据开始)以事件创建的时间(部分由用户定义,并通过TimestampExtractor设置)以事件创建的时间对数据进行重新处理,并与长期运行的非停止应用程序,将数据发送到输出主题(这两个应用程序都将读取并发送到用于构建状态的相同输出主题)。
商店是根据这些主题构建的,并且包括按会话进行的窗口显示。想象一下,我想为这些主题提供一个月的保留(用于无序的事件和消耗)-重新处理时,如果使用事件时间,我将处理(并生成)早于月活动。
按照KIP-32使用message.timestamp.type=LogAppendTime
以避免删除,将在状态存储中生成错误的数据(因为时间戳将是不正确的,并且将用于会话)。
使用事件时间,保持完全保留并在重新处理完成并使用完之后应用清除数据是很麻烦的,但将有助于减小主题的大小-但是,基于它们建立的存储又如何呢?例如。为了在重新处理发生时保留数据,我必须设置until
的伪无穷大设置,但是DSL创建的存储是(或者应该是)只读的,不能被操纵。
所以,回到标题:
答案 0 :(得分:0)
对于流,将LogAppendTime
用于分区主题是未命中配置。另请注意,您不会丢失重新分区主题中的任何数据,因为这些数据的创建保留时间为Integer.MAX_VALUE
(参见https://cwiki.apache.org/confluence/display/KAFKA/KIP-284%3A+Set+default+retention+ms+for+Streams+repartition+topics+to+Long.MAX_VALUE)。 Streams使用purgeData
API可以在重新使用分区主题后将它们从重新分区主题中删除(请参阅https://issues.apache.org/jira/browse/KAFKA-6150),以防止无限增长。
因此,我建议通过log.message.timestamp.type
重新配置所有重新分区主题(即主题级别配置)。