Kafka使用者正在读取重新启动时最后提交的偏移量(Java)

时间:2019-03-26 13:58:26

标签: apache-kafka kafka-consumer-api

我有一个kakfa使用者,其 enable.auto.commit 设置为 false 。每当我重新启动消费者应用程序时,它始终会再次读取上次提交的偏移量,然后再读取下一个偏移量。

例如上次提交的偏移量是50。重新启动使用者时,它将再次读取偏移量50,然后读取下一个偏移量。

我正在执行commitsync,如下所示。

Map<TopicPartition, OffsetAndMetadata> offsets = new HashMap<>();
offsets.put(new TopicPartition("sometopic", partition), new OffsetAndMetadata(offset));
kafkaconsumer.commitSync(offsets);

我尝试将 auto.offset.reset 设置为 最早 最新< / b> ,但不会改变行为。

我在使用者配置中是否缺少某些内容?

config.put(ConsumerConfig.CLIENT_ID_CONFIG, "CLIENT_ID");
config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
config.put(ConsumerConfig.GROUP_ID_CONFIG, "GROUP_ID");
config.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");
config.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class.getName());
config.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,CustomDeserializer.class.getName());
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");

2 个答案:

答案 0 :(得分:2)

如果要使用commitSync(offset),则必须小心并阅读其Javadoc

  

已提交的偏移量应该是应用程序将使用的下一条消息,即lastProcessedMessageOffset +1。

如果不对偏移量加+1,则预计下次重启时,使用者将再次消耗最后一条消息。如另一个答案所述,如果您使用commitSync()而不带任何参数,则不必担心

答案 1 :(得分:1)

您似乎正在尝试使用new OffsetAndMetadta(offset)进行提交。那不是典型的用法。

这是文档中手动偏移控制下的示例:

 List<ConsumerRecord<String, String>> buffer = new ArrayList<>();
 while (true) {
     ConsumerRecords<String, String> records = consumer.poll(100);
     for (ConsumerRecord<String, String> record : records) {
         buffer.add(record);
     }
     if (buffer.size() >= minBatchSize) {
         insertIntoDb(buffer);
         consumer.commitSync();
         buffer.clear();
     }
 }

https://kafka.apache.org/21/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html

注意在没有任何参数的情况下如何执行consumer.commitSync()调用。它只是消耗,并且会承诺到那时为止消耗的任何东西。