当Java KafkaStreams库正在重建它并重放changelog主题中的项目时,我觉得标点符号能够访问本地商店数据
让我们描述一下这是我们的场景:我有一个KafkaStreams应用程序A(用Java编写),我们在其中使用一个主题“ incoming-topic”,并且将一些对象放入时间戳记中作为键放入本地存储中。一些唯一的ID,例如:
键-> 201906122345_ds243132eddsfs 值->对象
然后,我们有一个标点符号从这家商店中读取任何分钟,以检索从“”到现在表示为yyyymmddhhMM的一系列项目(因此201906122345)。我们只想处理这些数据一次。它们被读取,从商店中删除并在另一个主题“中间主题”上转发,在此它们被另一个处理器使用和处理。 我们注意到,当我们向应用程序A添加节点时,或者当Kafka在节点之间重新分配分区时,我们正在重新处理旧条目。我的猜测是,在KafkaStreams库正在重建它时,标点器正在访问本地存储。仅在重建本地商店时,我才能发现这种情况。
问题:这是预期的行为吗?我使用错误的本地商店吗?我可以在重建本地商店时以某种方式配置标点符号不起作用的其他行为吗?
答案 0 :(得分:0)
在重新创建存储时,KafkaStreams不会调用Punctuators
。但是,默认情况下,KafkaStreams提供了至少处理语义,因此,如果发生错误并且重新分配了分区,则可能会重新处理某些数据。
对于常规的重新平衡(即正常关闭或横向扩展),实际上不应对数据进行两次处理。
也许通过设置processing.guarantees="exactly_once"
来启用EOS可以解决您的问题。但是,如果在定期/正常的重新平衡过程中看到重复,则可能是应用程序错误(或者KafkaStreams中存在错误)。很难说。