Java 在Kafka中添加重新分区后丢失旧聚合记录
我有一个卡夫卡流,有以下操作: stream.mapValues.groupByKey.aggregate。聚合基本上是将记录添加到列表中。 现在我将实现更改为:Java 在Kafka中添加重新分区后丢失旧聚合记录,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我有一个卡夫卡流,有以下操作: stream.mapValues.groupByKey.aggregate。聚合基本上是将记录添加到列表中。 现在我将实现更改为: stream.flatMap.groupByKey.aggregate。FlatMap正在复制记录:第一条记录与旧实现中的记录完全相同,第二条记录的密钥已更改。因此,在改变实现之后,重新分区正在发生,而在以前,情况并非如此(这很好)。我的问题是,在发布更改后,旧密钥的旧聚合记录消失了。从改变的那一刻起,一切都正常运转,但我不理解这种行
stream.flatMap.groupByKey.aggregate。FlatMap正在复制记录:第一条记录与旧实现中的记录完全相同,第二条记录的密钥已更改。因此,在改变实现之后,重新分区正在发生,而在以前,情况并非如此(这很好)。我的问题是,在发布更改后,旧密钥的旧聚合记录消失了。从改变的那一刻起,一切都正常运转,但我不理解这种行为。据我所知,由于我没有更改密钥,它应该和以前一样落在同一个分区上,聚合应该继续将消息添加到旧列表中,而不是从头开始。有人能帮我理解为什么会发生这种情况吗?如果更改处理拓扑,通常需要重置应用程序并重新处理输入主题中的所有数据以重新计算状态 在您的例子中,我假设
聚合
操作符在更改后具有不同的名称,因此不再“查找”其本地状态和更改日志主题
您可以通过拓扑#descripe()
比较这两种拓扑的名称
为了顺利升级,您需要通过Materialized.as(…)
为aggregate()
提供一个固定名称。如果您提供一个固定的名称(即,在旧拓扑和新拓扑中相同),问题就会消失。但是,由于原始拓扑没有提供固定名称,因此很难摆脱这种情况。欢迎使用stackoverflow。