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

Dee*_*eps 15 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
Run Code Online (Sandbox Code Playgroud)

我打电话给poll()一个循环.

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

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

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

有人可以澄清/确认吗?

Mat*_*Sax 15

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

假设您每10 ms调用一次poll,并将commit-interval设置为100ms.因此,在每第10次轮询调用将提交(并且此提交涵盖来自最近10次轮询调用的所有消息).

  • 在两次提交之间是的。这是旨在减少 Kafka 必须处理的提交数量的行为。回想一下,Kafka 提供至少一次交付保证。因此,这是在提交次数和发生故障时需要重新处理的数据量之间的权衡。 (2认同)
  • 在 KafkaStreams 中,消费者“auto.commit”被禁用,并且库进行手动提交。 (2认同)