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

coo*_*eze 3 apache-kafka kafka-consumer-api

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

因此,如果由于某种原因消费者未能发送特定消息,则该偏移量将不会被提交,然后您可以返回并重新处理该消息。

是否有任何东西可以跟踪您刚刚消耗的偏移量以及您随后提交的偏移量?

mik*_*ike 5

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

是的,有很大的不同。所消耗的量由消费者管理,以便消费者从主题分区中获取后续消息。

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

请记住,如果您的客户端没有提交 offsetn但后来提交了 offset n+1,对于 Kafka 来说,它不会与您提交两个偏移量时的情况有所不同。


编辑:有关已消耗已提交偏移量的更多详细信息可以在 KafkaConsumer 关于偏移量和消费者位置的 JavaDocs 中找到:

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

消费者的位置给出了将给出的下一条记录的偏移量。它将比消费者在该分区中看到的最高偏移量大 1。每次消费者在调用 poll(Duration) 中收到消息时,它都会自动前进。

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

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