启用Kafka自动提交时,是否会多次提交相同的偏移量?

时间:2018-05-27 18:02:36

标签: apache-kafka kafka-consumer-api

让我们假设 enable.auto.commit = true ,让我们假设我读取消息的主题有一段很长的不活动时间(没有消息说48h)。因此,连续的poll()调用将不会返回48h的任何消息,我的问题是:

__ consumer_offsets 主题中的每个 auto.commit.interval.ms 是否会一次又一次地提交最后返回的消息的偏移量(48小时相同)并且其到期时间由 offsets.retention.minutes

控制

一次又一次地提交会阻止 __ consumer_offsets 主题中的记录过期并在某些时候被删除。

1 个答案:

答案 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();
    }
}

我希望这有帮助!