java - Kafka Stream Punctuator 在重建本地存储数据时访问它

标签 java apache-kafka-streams

我感觉标点符号能够访问本地存储数据,而 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/

相关文章:

Java Hibernate ID 问题

java - 使用 Spring 和 Hibernate 的多数据库事务管理

java - 弹出菜单项图标

java - 如果我在kafka流中设置commit.interval.ms =的值,它是否能够提交偏移量?

apache-kafka - 如何在KTable中动态查找?

java - Java to C实现中equalsIgnoreCase的建议

Java 排列挑战很慢

java - 使用自定义 TimestampExtractor 的 Kafka Streams 窗口

java - kafka-streams - TopologyBuilder/KStreamBuilder 对象是否可重用?

apache-kafka - 具有多个输出主题的 Kafka 流拓扑的并发性