当我从kafka的多个分区中轮询记录并将一个记录提交到一个分区时,其余记录将丢失

时间:2019-08-08 09:56:07

标签: apache-kafka kafka-consumer-api

我轮询来自多个分区的记录,仅提交一条记录,然后其余记录似乎也已提交,因为我无法再次轮询它们。而且我已经将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

从日志中可以看到某些消息丢失了,因为偏移量不是连续的。有人知道为什么吗?

1 个答案:

答案 0 :(得分:0)

一次轮询几个记录(一次轮询),因此尝试一次只轮询一个记录(可以减少轮询间隔),然后提交该记录。 将kafka使用者的“ max.poll.records”属性设置为“ 1”。