kafka是否可以区分消耗的偏移量和提交的偏移量?

时间:2020-11-10 19:26:28

标签: apache-kafka kafka-consumer-api

据我了解,消费者从特定主题中读取消息,消费者客户端将定期提交偏移量。

因此,如果使用者由于某种原因未能通过一条特定的消息,则不会提交该偏移量,然后您可以返回并重新处理该消息。

有没有什么可以追踪您刚刚消耗的偏移量以及您随后提交的偏移量的?

1 个答案:

答案 0 :(得分:1)

kafka可以区分消耗的偏移量和提交的偏移量吗?

是的,有很大的不同。使用者管理已消耗偏移量,以便使用者将从主题分区中提取后续消息。

使用者可以(但不是必须)自动或通过调用提交API来提交消息。该信息存储在名为__consumer_offsets的Kafka内部主题中,并基于ConsumerGroup,Topic和Partition存储提交的偏移量。如果客户端开始重新启动或新的使用者加入/退出使用者组,则将使用它。

请记住,如果您的客户端未提交偏移量n,但后来提交了偏移量n+1,那么对于Kafka来说,与您提交两个偏移量的情况都没有什么不同。


编辑:有关已消耗已提交偏移的更多详细信息,可以在Offsets and Consumer Position的KafkaConsumer的JavaDocs中找到:

Kafka维护分区中每个记录的数字偏移量。此偏移量充当该分区内记录的唯一标识符,并且还指示使用者在分区中的位置。例如,位置5的消费者使用了偏移量为0到4的记录,然后将接收偏移量为5的记录。实际上,有两个与消费者的用户相关的位置概念:

使用者的位置给出了将要给出的下一个记录的偏移量。这将比消费者在该分区中看到的最高偏移量大一个。每当使用者在对poll(Duration)的呼叫中收到消息时,它都会自动前进。

已提交位置是已安全存储的最后一个偏移量。如果该过程失败并重新启动,则这是使用者将恢复到的偏移量。使用者可以定期自动提交偏移量;也可以选择通过调用一种提交API(例如commitSync和commitAsync)来手动控制此提交位置。

这种区别使消费者可以控制何时将记录视为已消费。下面将对其进行详细讨论。