Java Kafka将全局表同步化流到应用程序
对于正常工作的k流,kafka将每个应用程序的偏移存储在其内部偏移主题上。在应用程序重新启动时,应用程序根据Java Kafka将全局表同步化流到应用程序,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,对于正常工作的k流,kafka将每个应用程序的偏移存储在其内部偏移主题上。在应用程序重新启动时,应用程序根据auto.offset.reset策略重新处理主题。这是可以解释的 我使用kafka stream的GlobalKTable在应用程序上复制数据。但是,我对应用程序的重新启动感到有点困惑,因为在重新启动后(由于部署或崩溃),id(StreamsConfig.APPLICATION\u id\u CONFIG)没有更改的应用程序上没有填充。每当我用新id启动streams应用程序的新实例时,
auto.offset.reset
策略重新处理主题。这是可以解释的
我使用kafka stream的GlobalKTable
在应用程序上复制数据。但是,我对应用程序的重新启动感到有点困惑,因为在重新启动后(由于部署或崩溃),id(StreamsConfig.APPLICATION\u id\u CONFIG
)没有更改的应用程序上没有填充。每当我用新id启动streams应用程序的新实例时,GlobalKTable
就会被填充
一个GlobalKTable
没有什么不同,只是一个启用了日志压缩功能的主题。创建一个状态的javadoc:
请注意,GlobalKTable
始终应用“自动偏移重置”策略
“最早”不考虑StreamsConfig
中的指定值
因此,我希望,无论应用程序id如何,我的streams应用程序从一开始就读取kglobaltable存储
主题,并像这样在本地填充存储。javadoc引用的主题似乎是some topic
,而不是kglobaltable store
这是GlobalKTable
的预期行为吗?此外,对于支持GlobalKTables
的主题是否有保留策略
当我们对某些主题
有保留策略时,这种行为还会导致kglobaltable存储
主题上的数据过时。例如:
在时间t0,让
一些话题:(1,a)->(2,b)->(1,c)
kglobaltable存储:[(1,c)、(2,b)]
在一段时间(2,b)被保留后,我启动我的streams应用程序(使用新id),并且我的GlobalKTable
仅存储记录(1,c)
编辑:我在MemoryKeyValueStore中使用
作为一种解决方法,您可以删除全局存储的本地检查点文件(cf)——这将在重新启动时触发引导。或者切换回默认的RocksDB
store
顺便说一句:如果您直接以表或全局表的形式阅读主题,Kafka Streams将不会为容错创建额外的changelog主题,而是为此使用原始输入主题(这将减少Kafka集群内的存储需求)。因此,这些输入主题应该启用日志压缩
streamsBuilder.globalTable("some-topic", Materialized.as("kglobaltable-store"))