2016-07-06 3080 views
10

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

为了使它更具体,考虑的场景在那里我有以下几点:

enable.auto.commit =真

auto.commit.interval.ms = 10

我呼吁调查()在一个循环中。

1)在第一次调用poll(),我得到的消息1000(偏移2000-3000),它需要1毫秒再次处理所有1000条短信

2)我叫轮询()。在第二次poll()调用中,它应该提交从前一个poll()返回的最新偏移量3000,但由于auto.commit.interval.ms设置为10 ms,它不会提交偏移量,对不对?

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

有人可以澄清/确认吗?

回答

9

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

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

+0

你说得对。最终2个偏移量(承诺和最新处理)同步,但在此之前提交的偏移将继续落后。 – Deeps

+0

两次提交之间是。这是旨在减少Kafka必须处理的提交数量的预期行为。回想一下,卡夫卡提供至少一次交付保证。因此,这是提交次数与失败时需要重新处理多少数据之间的折中。 –

+0

如果轮询呼叫在100ms之后并且将自动提交间隔设置为10ms,该怎么办。 –