我感觉标点符号能够访问本地存储数据,而 Java KafkaStreams 库正在重建它并重播更改日志主题中的项目
让我们描述一下我们的场景:我有一个 KafkaStreams 应用程序 A(用 Java 编写),其中我们从一个主题“传入主题”进行消费,并且使用时间戳加作为键将一些对象放入本地存储中一些唯一的 ID,例如:
key -> 201906122345_ds243132eddsfs 值 -> 对象
然后,我们有一个标点符号读取该商店中的任何分钟,检索从“”到现在表示为 yyyymmddhhMM 的一系列商品(因此 201906122345)。我们只想处理这些数据一次。它们被读取、从存储中删除并转发到另一个主题“中间主题”,在那里它们由另一个处理器使用和处理。 我们注意到,当我们向应用程序 A 添加节点时,或者当 Kafka 在节点之间重新平衡分区时,我们正在重新处理旧条目。我的猜测是标点符号正在访问本地存储,而 KafkaStreams 库正在重建它。我在重建本地商店时才发现很少这样的案例。
问题:这是预期的行为吗?我是否以错误的方式使用本地商店?我可以以某种方式配置不同的行为,使标点符号在重建本地存储时不起作用吗?
最佳答案
在重新创建存储时,KafkaStreams 不会调用标点符号。但是,KafkaStreams默认提供至少处理语义,因此,如果发生错误并重新平衡分区,则可能会重新处理某些数据。
对于定期重新平衡,即正常关闭或横向扩展,数据实际上不应被处理两次。
也许通过设置 processing.guarantees="exactly_once"
来启用 EOS 可以满足您的需要。但是,如果您在定期/正常重新平衡期间看到重复,则可能存在应用程序错误(或者 KafkaStreams 中存在错误)。很难说。
关于java - Kafka Stream Punctuator 在重建本地存储数据时访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56650706/