我轮询来自多个分区的记录,仅提交一条记录,然后其余记录似乎也已提交,因为我无法再次轮询它们。而且我已经将auto.commit
设置为false
,不知道为什么。但是,如果该主题只有一个分区,那么它可以正常工作,我在第一次轮询中未提交的记录将再次被重新轮询。一个分区以上时,为什么结果会不同?
public static void main(String[] args) throws IOException,
InterruptedException {
initKafkaConsumer();
do {
ConsumerRecords<String, String> records = consumer.poll(1000);
for (TopicPartition partition : records.partitions()) {
List<ConsumerRecord<String, String>> partitionRecords = records.records(partition);
for (ConsumerRecord<String, String> record : partitionRecords) {
LOG.info("partition = {}, offset = {}, value = {}", record.partition(), record.offset(), record.value());
consumer.commitSync(
Collections.singletonMap(partition, new OffsetAndMetadata(record.offset() + 1)));
break;
}
}
} while (true);
}
根据@mazaneicha的评论,我重新运行该程序,结果似乎我已经提交了所有记录,没有超出外部循环,但是我的日志说(我已在代码中打印出记录信息)诸如此类的怪异事物:
09:37:38.786 [main] INFO org.test.kafka.Consumer-分区= 2,偏移量= 0,值=此消息2
09:37:38.786 [main] INFO org.test.kafka.Consumer-分区= 2,偏移量= 10,值=此消息21
09:37:38.786 [main] INFO org.test.kafka.Consumer-分区= 2,偏移= 11,值=该消息24
09:37:38.786 [main] INFO org.test.kafka.Consumer-分区= 2,偏移量= 13,值=此消息30
09:37:38.786 [main] INFO org.test.kafka.Consumer-分区= 2,偏移量= 14,值=此消息33
从日志中可以看到某些消息丢失了,因为偏移量不是连续的。有人知道为什么吗?
答案 0 :(得分:0)
一次轮询几个记录(一次轮询),因此尝试一次只轮询一个记录(可以减少轮询间隔),然后提交该记录。 将kafka使用者的“ max.poll.records”属性设置为“ 1”。