在没有提交操作的情况下使用Java Kafka Consumer是否正确?

时间:2019-03-20 17:37:44

标签: java apache-kafka kafka-consumer-api

我需要从开始偏移量到结束偏移量读取记录集。为此,我使用专用的Kafka消费者。我至少可以使用一次语义(以防万一,如果给定的应用程序实例发生故障,并且新的应用程序实例从该起始偏移量重新读取记录)。

那么,我可以使用这样的代码吗?

private static KafkaConsumer<Long, String> createConsumer() {

    final Properties props = new Properties();

    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
    props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
    props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class.getName());
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

    return new KafkaConsumer<>(props);
}

public void process() {

    KafkaConsumer consumer = createConsumer();
    TopicPartition topicPartition = new TopicPartition("topic", 2);
    consumer.assign(List.of(topicPartition));

    long startOffset = 42;
    long endOffset = 100;

    consumer.seek(topicPartition, startOffset);

    boolean isRunning = true;
    while (isRunning) {
        final ConsumerRecords<Long, String> consumerRecords = consumer.poll(1000);

        for (ConsumerRecord<Long, String> record : consumerRecords) {
            if (record.offset() >= endOffset) {
                isRunning = false;
                break;
            }
        }
    }

    consumer.close();
}

所以:

  • 我没有commit()
  • 我禁用了auto-commit
  • 我没有group-id

它是正确的代码吗?还是有一些隐藏的问题?

1 个答案:

答案 0 :(得分:1)

是的,这是正确的用法,您不应该遇到任何问题。这不是Kafka使用者的典型用法,但允许使用。

来自官方KafkaConsumer Javadoc(我的重点):

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

  

控制消费者的位置

     

在大多数使用情况下,使用者只会简单地从头到尾使用记录,并定期(自动或手动)确定其位置。 但是,Kafka允许使用者手动控制其位置,随意在分区中向前或向后移动。 。这意味着使用者可以重新使用较旧的记录,也可以跳至最新记录,而不实际消耗中间记录。   在某些情况下,手动控制消费者的位置可能会有用。

     

...

     

Kafka允许使用seek(TopicPartition,long)指定位置以指定新位置 。还可以使用特殊方法来查找服务器维护的最早和最新偏移(分别为seekToBeginning(Collection)和seekToEnd(Collection))。