让我们假设 enable.auto.commit = true ,让我们假设我读取消息的主题有一段很长的不活动时间(没有消息说48h)。因此,连续的poll()调用将不会返回48h的任何消息,我的问题是:
__ consumer_offsets 主题中的每个 auto.commit.interval.ms 是否会一次又一次地提交最后返回的消息的偏移量(48小时相同)并且其到期时间由 offsets.retention.minutes ?
控制一次又一次地提交会阻止 __ consumer_offsets 主题中的记录过期并在某些时候被删除。
答案 0 :(得分:4)
这是一个有趣的。
修改:根据最近的评论,更新此内容。更新的部分 strikedthrough 并明确标记或斜体。
我会选择"否" "是" 即最后返回的消息的偏移量一次又一次地提交。
以下是对此的解释。
典型的消费者示例如下所示:
Properties props = new Properties();
<other-properties>
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
consumer.subscribe(Arrays.asList("foo", "bar"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value());
}
因此,通常偏移提交的责任在于消费者,并且由轮询循环驱动。
现在,在您上次提交后描述的场景中,每次调用poll()
方法都会返回一张空地图。 因此,如果 poll()
没有返回任何记录,则没有新的偏移量被提交。
这里是我如何追踪卡夫卡的源代码并得出这个结论。以下return语句来自给定here
的poll()
方法定义
return ConsumerRecords.empty();
此file中可用的empty()
方法的定义。
修改:以下部分是基于Gwen评论的新增内容。
但是,在返回空映射之前,通过poll()
类的ConsumerCoordinator
方法调用了另一个poll()
方法(位于KafkaConsumer
类中),根据给定here的定义。如果通过以下方法启用它们,则处理周期性偏移提交:
public void maybeAutoCommitOffsetsAsync(long now) {
if (autoCommitEnabled && now >= nextAutoCommitDeadline) {
this.nextAutoCommitDeadline = now + autoCommitIntervalMs;
doAutoCommitOffsetsAsync();
}
}
我希望这有帮助!