我在Kafka流字计数应用程序中有一个状态存储库(使用Materialized.as()
)。
根据我的理解,状态存储在Kafka内部主题中维护。
请提供解决方案的来源(如果有)。
答案 0 :(得分:2)
状态存储区可以有无限制的键/值对吗?还是由基于log.retention策略或log.segment.bytes的kafka主题规则控制?
是的,状态存储可以具有无限的键值对=事件(或“消息”)。好吧,当然,Kafka中的本地应用程序存储空间和远程存储空间允许(后者用于将数据持久存储在状态存储中)。
您的应用程序的状态存储在压缩的内部Kafka主题中远程保留。压缩意味着Kafka会定期从存储中清除同一事件密钥的旧事件(例如Bob的旧帐户余额)。但紧凑的主题不会删除每个事件键的最新事件(例如,鲍勃的当前帐户余额)。压缩主题中将存储多少个“唯一”键值对没有上限。
将主题配置为压缩(我将log.retention.ms = 60000设置为,并希望状态存储值在一分钟后会重置为0。但是我发现这没有发生,我仍然可以从状态存储中看到值。
log.retention.ms
)时不使用 log.cleanup.policy=compact
。有关详细信息,请参见现有的SO问题Log compaction to keep exactly one message per key,包括为何不立即进行压缩的原因(总之,这是因为压缩对分区段文件进行操作,不会接触最新的段文件,并且可能有多个事件该文件中的每个事件键)。
注意:现在,您可以将配置log.cleanup.policy
设置为压缩和基于时间/卷的保留与log.cleanup.policy=compact,delete
的组合(有关详细信息,请参见KIP-71)。但是,除非您真的知道自己在做什么,否则通常不要摆弄此设置-默认值是99%的时间需要的设置。
kafka是否完全清除了日志或保留了SNAPSHOT,以防出现日志压缩主题? “段已落实”是什么意思?
不幸的是,我不明白这个问题。 :-)也许我以前的答案和参考链接已经满足您的需求。我能说的是,不,Kafka不会完全清除日志。压缩对主题分区的段文件进行操作。您可能需要阅读压缩的工作原理,如果Apache Kafka文档还不够清楚,我建议您参考https://medium.com/@sunny_81705/kafka-log-retention-and-cleanup-policies-c8d9cb7e09f8之类的文章。
答案 1 :(得分:0)
状态存储由紧凑的内部主题维护。因此,它们遵循压缩主题的相同语义,并且必须保留有限的时间
https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Internal+Data+Management