Kafka commitAsync重试使用提交订单

时间:2018-11-10 15:46:44

标签: apache-kafka commit offset kafka-consumer-api

我正在阅读权威指南卡姆卡,并且在“消费者”一章中有一个关于“重试异步提交”的内容:

  

获得正确的异步重试提交顺序的简单模式是使用单调递增的序列号。每次提交时增加序列号,并在提交时将序列号添加到 commitAsync 回调中。准备发送重试时,检查回调获得的提交序列号是否等于实例变量;如果是,则没有较新的提交,可以重试。如果实例序列号更高,请不要重试,因为已经发送了新的提交。

对于像我这样的稠密人来说,作者的一个简短例子本来会很棒。对于上面加粗的部分,我尤其不清楚。

任何人都可以阐明这意味着什么,或者甚至可以提供一个玩具示例来证明这一点吗?

1 个答案:

答案 0 :(得分:1)

这就是我想的,但是要谦虚,我可能是错的

      try {
        AtomicInteger atomicInteger = new AtomicInteger(0);
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(5);
            for (ConsumerRecord<String, String> record : records) {
                System.out.format("offset: %d\n", record.offset());
                System.out.format("partition: %d\n", record.partition());
                System.out.format("timestamp: %d\n", record.timestamp());
                System.out.format("timeStampType: %s\n", record.timestampType());
                System.out.format("topic: %s\n", record.topic());
                System.out.format("key: %s\n", record.key());
                System.out.format("value: %s\n", record.value());
            }

            consumer.commitAsync(new OffsetCommitCallback() {
                private int marker = atomicInteger.incrementAndGet();
                @Override
                public void onComplete(Map<TopicPartition, OffsetAndMetadata> offsets,
                                       Exception exception) {
                    if (exception != null) {
                        if (marker == atomicInteger.get()) consumer.commitAsync(this);
                    } else {
                        //Cant' try anymore
                    }
                }
            });
        }
    } catch (WakeupException e) {
        // ignore for shutdown
    } finally {
        consumer.commitSync(); //Block
        consumer.close();
        System.out.println("Closed consumer and we are done");
    }