需要澄清Kafka自动提交和auto.commit.interval.ms

时间:2016-07-06 18:07:58

标签: kafka-consumer-api

文档https://www.safaribooksonline.com/library/view/kafka-the-definitive/9781491936153/ch04.html表示“请注意,启用自动提交后,对poll的调用将始终提交上次轮询返回的最后一个偏移量。它不知道实际处理了哪些事件因此,在再次调用poll之前总是处理poll返回的所有事件(或者在调用close()之前,它还将自动提交偏移量)“。如果是这样的话,如果auto.commit.interval.ms大于处理从前一个poll()收到的消息的时间,它是如何工作的。

为了使其更具体,请考虑我有以下情况:

enable.auto.commit=true

auto.commit.interval.ms=10

我在循环中调用poll()

1)在第一次呼叫poll()时,我收到1000条消息(偏移2000-3000),处理所有1000条消息需要1毫秒

2)我再次致电poll()。在第二个poll()调用中,它应该提交从前一个poll()返回的最新偏移量3000,但是由于auto.commit.interval.ms设置为10毫秒,它不会提交偏移量,对吧? / p>

在这种情况下,提交的偏移量会滞后于实际处理的最新偏移量吗?

有人可以澄清/确认吗?

1 个答案:

答案 0 :(得分:13)

您正确描述了行为。但是,你的结论是不正确的。承诺的偏移量不会越来越滞后。在自动提交间隔过去后,下一次轮询调用将提交所有处理的消息。

让我们说,你每10毫秒调用一次poll,并将commit-interval设置为100ms。因此,在每10次轮询调用中都会提交(并且此提交将涵盖最近10次轮询调用的所有消息)。