繁体   English   中英

有没有办法在 java 中从头开始使用 Kafka 流(而不是通过 KafkaConsumer)读取消息?

[英]Is there a way to read messages using Kafka stream(not via KafkaConsumer) from beginning everytime in java?

我们正在创建一个 POC 来读取数据库 CDC 并将其推送到外部系统。

  1. 每个源表 CDC 以 Avro 格式发送到各自的主题(使用 Kafka Schema Registry 和 Kafka Server)
  2. 我们正在编写 java 代码来使用 avro 模式中的消息,使用 AvroSerde 对其进行反序列化并加入它们,然后发送到不同的主题,以便外部系统可以使用它。

虽然我们有一个限制,但我们无法向源表主题生成消息以发送/接收新的内容/更改。 因此,编写连接代码的唯一方法是在我们运行应用程序时每次从每个源主题从头开始读取消息。(直到我们确信代码正在工作并且可以再次开始接收实时数据)

在 KafkaConsumer object 中,我们可以选择使用 seekToBeginning 方法强制从 java 代码开始读取,这很有效。 但是,当我们尝试使用 KStream object 并强制从头开始读取 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 主题时,没有选项。 这里有什么替代方案?

我们尝试使用带有 --to-earliest 的 kafka-consumer-groups reset-topic 重置偏移量,但这只会将偏移量设置为最接近的值。 当我们尝试使用 --to-offset 参数使用“0”手动重置偏移量时,我们得到以下警告但未设置为“0”。 我的理解是,设置为 0 应该从头开始阅读消息。 如果我错了,请纠正我。

“警告新偏移量 (0) 低于主题分区的最早偏移量”

下面的示例代码

Properties properties = new Properties();
properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVER);
properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, GROUP_ID);
properties.put("schema.registry.url", SCHEMA_REGISTRY_URL);
properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
properties.put(StreamsConfig.APPLICATION_ID_CONFIG, APPLICATION_ID);

StreamsBuilder builder = new StreamsBuilder();
//nothing returned here, when some offset has already been set
KStream myStream = builder.stream("my-topic-in-avro-schema",ConsumedWith(myKeySerde,myValueSerde)); 

KafkaStreams streams = new KafkaStreams(builder.build(),properties);
streams.start();

一种方法是在每次启动 stream 应用程序时生成一个随机 ConsumerGroup。 就像是:

properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, GROUP_ID + currentTimestamp);

这样,stream 将从“最早”开始读取,因为您已经在auto.offset.reset中设置了它。

顺便说一句,您在代码中设置了两次group.id的属性...

它将帮助同样面临同样问题的人。 使用配置属性中的 UUID.randomId.toString() 将应用程序 ID 和组 ID 替换为某个唯一标识符。 它应该从头开始获取消息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM