即使启用了自动提交,Kafka使用者偏移也会延迟

时间:2016-05-14 23:40:20

标签: kafka-consumer-api

我正在使用Kafka 0.9使用者API来使用一些已发布的主题消息。我正在使用以下代码连续轮询来自代理的指定主题的消息。我正在使用consumer.seek(topic, offset)开始从偏移量11700开始读取消息,并且我按预期收到以该偏移量开始的所有消息。但是,当我使用kafka-consumer-offset-checker.sh查看偏移量时,我总是使用以下命令看到相同的最后提交偏移量(12700)和滞后量(1000)。

bin/kafka-consumer-offset-checker.sh --zookeeper localhost:2181 --topic cardiac-dicom-message --group test7

输出:

Group           Topic                          Pid Offset          logSize         Lag             Owner

test7           cardiac-dicom-message          0   12700           13700           1000            none

基于Spark文档,如果我们在循环中进行轮询,对consumer.poll()的调用将提交从前一个consumer.poll()调用返回的最大偏移量(13699),所以我很困惑。 / p>

以下是示例代码:

 Properties props = new Properties();
 props.put("bootstrap.servers", "kafka-server:9092");
 props.put("group.id", "test7");
 props.put("enable.auto.commit", "true");
 props.put("auto.commit.interval.ms", "10");
 props.put("session.timeout.ms", "30000");
 props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
 props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
 KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);

 //consume specific partition
 TopicPartition topicPartion = new TopicPartition("cardiac-dicom-message", 0);
 consumer.assign(Arrays.asList(topicPartion));
 consumer.seek(topicPartion, 11700);

 while (true) {
     ConsumerRecords<String, String> records = consumer.poll(1000);
     System.out.println("number of messages = " + records.count());
     int count=0;
     for (ConsumerRecord<String, String> record : records) {
         count++;
             System.out.printf("partition = %d, offset = %d, key = %s, value = %s\n", record.partition(), record.offset(), record.key(), record.value());
     }
 }

任何人都可以对此有所了解吗?

0 个答案:

没有答案