在我们的代码中,我们计划手动提交偏移量。我们对数据的处理是长期的,因此我们遵循之前建议的模式
代码看起来像这样:
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
答案 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的两种方法的语法