Apache Kafka:暂停后commitSync

时间:2017-08-17 14:07:12

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

在我们的代码中,我们计划手动提交偏移量。我们对数据的处理是长期的,因此我们遵循之前建议的模式

  1. 阅读记录
  2. 在自己的主题中处理记录
  3. 暂停消费者
  4. 继续投票暂停消费者以使其活着
  5. 处理记录时,提交抵消
  6. 完成提交后,恢复消费者
  7. 代码看起来像这样:

       while (true) { 
              ConsumerRecords<String, String> records = consumer.poll(kafkaConfig.getTopicPolling());
                    if (!records.isEmpty()) {
                        task = pool.submit(new ProcessorTask(processor, createRecordsList(records)));
                    }
                    if (shouldPause(task)) {
                        consumer.pause(listener.getPartitions());
                    }
                    if (isDoneProcessing(task)) {
                       consumer.commitSync();
                       consumer.resume(listener.getPartitions());
                    }
        }
    

    如果您注意到,我们使用commitSync()(不带任何参数)进行提交。 由于消费者暂停,在下一次迭代中我们将没有记录。但是commitSync()会在以后发生。在那种情况下,它会尝试提交偏移量吗?我已阅读权威指南并用Google搜索,但无法找到有关它的任何信息。

    我认为我们应该明确保存偏移量。但我不确定当前的代码是否会成为一个问题。

    任何信息都会有所帮助。

    谢谢, Prateek

1 个答案:

答案 0 :(得分:0)

如果您在没有参数的情况下致电consumer.commitSync(),则应提交您的消费者已收到的最新偏移量。由于您可以在单个poll()中接收许多消息,因此您可能希望更好地控制提交并显式提交特定的偏移量,例如消费者已成功处理的最新消息。这可以通过调用commitSync(Map<TopicPartition,OffsetAndMetadata> offsets)

来完成

您可以在Consumer Javadoc http://kafka.apache.org/0110/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#commitSync()

中看到调用commitSync的两种方法的语法