当前位置: 首页 > 科技观察

必问面试-说说Kafka的消费模型?

时间:2023-03-18 15:19:54 科技观察

大家好,我是冰河~~最近有读者上头条,被面试官问了一个关于Kafka的问题:多个Kafka消费者如何同时消费同一个Topic下同一个Partition的数据时间?一个简单的问题就把这位读者搞糊涂了!今天,我们就一起来聊聊这道面试题。好了,开始今天的话题。题目分析首先需要明确面试官的问题:多个Kafka消费者如何同时消费同一个Topic下同一个Partition的数据?同一个Topic下同一个Partition的数据是没问题的。为了能够很好地回答这个问题,我们需要了解一下Kafka中的一个概念,就是ConsumerGroup。消费者组是Kafka实现单播和广播两种消息模型的基础和手段。对于同一个Topic(主题),每个消费者组都可以获得这个Topic中的所有数据。消费者组中的所有消费者协同订阅并消费KafkaTopic中的所有分区。这里,每个分区只能被同一个消费者组中的一个消费者消费。这里,为了更好的理解,我们简单画了一张Kafka消费消息的示意图,如下图。在这个图中,一个主题可以配置多个分区。生产者发送的消息被分发到不同的分区。consumer接收数据时,按照consumergroup接收。Kafka保证每个分区的消息只能由同一个分区发送。一个消费组中同一个消费者的消费。如果要重复消费,需要其他消费组消费。Zookeerper保存了每个消费者组中每个主题下每个分区消费的偏移量。新版本的kafka把这个offset保存在一个__consumer_offsert的topic下。这个__consumer_offsert有50个分区,保存到哪个分区是通过将消费者组的id散列到%50来确定的。这也是考虑到Zookeeper不擅长读写大量数据。因此,如果想让一个消费者组使用多个消费者同时消费Kafka中的消息,可以使用多个线程来读取消息,一个线程相当于一个消费者实例。当消费者数量大于分区数量时,部分消费者线程无法读取数据。为了扩展知识,我们举个例子:假设一个topictestTopic被groupA消费了,现在又启动了一个新的groupB来消费testTopic。testTopic-groupB默认的offset不是0,但是Kafka中并没有建立这样的Offset。除非testTopic主题有数据,否则groupB会收到数据,也是第一条数据。此时groupB的Offset不是从0开始,而是从新初始化的Offset开始,除非显示正式使用--from-beginning从0开始获取数据。同一个Topic下的同一个Partition,他们需要把这些Kafka消费者放到不同的消费者组中。好了,今天就这些了,我是冰河,我们下期再见~~本文转载自微信公众号“冰河科技”,可以通过以下二维码关注。转载本文请联系冰川科技公众号。