Zookeeper/Kafka是如何为消费者保留偏移量的?

6

偏移量是主题/分区的属性还是消费者的属性?

如果它是消费者的属性,那么从同一分区读取的多个消费者可能具有不同的偏移量吗?

此外,如果消费者断开连接,Kafka如何知道它在处理重新上线的同一消费者?新的客户端ID会生成,所以它与之前的ID不同。

2个回答

9

在大多数情况下,消费者组的属性是其所必须具备的。在编写消费者时,通常需要在group.id参数中指定消费者组。该组ID用于从Kafka集群自身的特殊主题__consumer_offsets中恢复/存储最新的偏移量。消费者组不仅用于偏移量,还用于确保每个分区只会被单个客户端从消费者组中消费。

然而,Kafka提供了很多灵活性 - 因此,如果您需要,可以将偏移量存储在其他地方,并且可以基于任何您想要的标准进行处理。但在大多数情况下,按照消费者组的概念并将偏移量存储在Kafka内部是您可以做的最好的事情。


谢谢@Jakub提供了很多的明确信息。这是否意味着对于任何给定的主题,每个消费者组将在该主题中的每个分区中存储/保留一个偏移量? - yogibear
2
是的,偏移量与键一起存储在那里,基本上是“消费者组-主题-分区”。该主题已压缩,因此它始终尝试仅保留最新的消息并删除具有相同键的旧消息。压缩并不意味着始终只有一个给定键的消息,但是当新客户端启动时,它将始终使用给定键的最后一个偏移量,因此这不是问题。有关日志压缩的更多信息,请参见:http://kafka.apache.org/documentation/#compaction - Jakub

1

Kafka根据消费者属性group.id来识别消费者,每个消费者都应该有这个属性。

一个唯一的字符串,用于标识此消费者所属的消费者组。如果消费者使用subscribe(topic)或基于Kafka的偏移量管理策略,则需要此属性。

至于offset,它是消费者属性和代理属性,每当消费者从kafka主题中消费消息时,它将提交偏移量(这意味着已经消费了1到10条消息),下次将从10开始消费,可以手动提交偏移量,也可以自动提交enable.auto.commit

如果为true,则消费者的偏移量将在后台定期提交。

每个消费者组都有自己的偏移量,基于此,kafka服务器识别新的消费者还是重启的旧消费者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接