【问题标题】:Kafka Stream Punctuator accessing local store data while rebuilding itKafka Stream Punctuator 在重建时访问本地存储数据
【发布时间】:2026-02-05 00:40:01
【问题描述】:

我感觉标点符号能够访问本地存储数据,而 Java KafkaStreams 库正在重建它以重播更改日志主题中的项目

让我们描述一下我们的场景:我有一个 KafkaStreams 应用程序 A(用 Java 编写),我们正在从一个主题“传入主题”中消费,我们将一些对象放入本地存储中,使用时间戳作为键加上一些唯一的 id,例如:

键-> 201906122345_ds243132eddsfs 值 -> 对象

然后我们有一个标点符号从这家商店读取任何一分钟,检索从“”到现在表示为 yyyymmddhhMM 的一系列项目(所以 201906122345)。我们只想处理这些数据一次。它们被读取,从存储中删除并转发到另一个主题“中间主题”,在那里它们被另一个处理器使用和处理。 我们注意到,当我们向应用程序 A 添加节点时,或者当 Kafka 在节点之间重新平衡分区时,我们正在重新处理旧条目。我的猜测是标点符号正在访问本地商店,而 KafkaStreams 库正在重建它。只有在重建本地商店时,我才能够找到很少的这种情况。

问题:这是预期的行为吗?我是否以错误的方式使用本地商店?在重建本地商店时,我能否以某种方式配置不同的行为,使标点符号不起作用?

【问题讨论】:

    标签: java apache-kafka-streams


    【解决方案1】:

    KafkaStreams 在重新创建存储时不会调用Punctuators。但是,KafkaStreams 默认提供至少处理语义,因此,如果发生错误并重新平衡分区,则可能会重新处理一些数据。

    对于定期重新平衡,即正常关闭或横向扩展,数据实际上不应被处理两次。

    也许通过设置 processing.guarantees="exactly_once" 来启用 EOS 对你有用。但是,如果您在常规/正常重新平衡期间看到重复,则可能存在应用程序错误(或 KafkaStreams 中存在错误)。很难说。

    【讨论】: