头条二面Kafka面经总结:搞懂Kafka的这个问题,你离大厂就不远了!!(建议收藏)
Posted 冰 河
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了头条二面Kafka面经总结:搞懂Kafka的这个问题,你离大厂就不远了!!(建议收藏)相关的知识,希望对你有一定的参考价值。
大家好,我是冰河~~
最近,有些读者去头条二面,被面试官问了一个关于Kafka的问题:多个Kafka消费者如何同时消费相同Topic下的相同Partition的数据? 看似一个简单的问题,竟然把这位读者问懵了!
今天,我们就一起来说说这个面试题,好了,开始今天的主题。
题目分析
首先,要明确面试官的问题:多个Kafka消费者如何同时消费相同Topic下的相同Partition的数据? 这个问题问的已经很明显了,我们只要回答出如何让多个Kafka消费者同时消费相同Topic下的相同Partition的数据就可以了。
为了能够回答好这个问题,我们需要理解Kafka中的一个概念,就是 消费者组(Consumer Group)。消费者组是Kafka实现单播和广播两种消息模型的基础和手段。对于同一个Topic(主题)来说,每个消费者组都可以拿到这个Topic中的全部数据。消费者组内的所有消费者协调在一起来订阅并消费Kafka Topic中的所有分区。这里,每个分区只能由同一个消费者组内的一个消费者来消费。
这里,为了更好的理解,我们简单的画一张Kafka消费消息的原理图,如下所示。
在这张图中,一个主题可以配置几个分区,生产者发送的消息分发到不同的分区中,消费者接收数据的时候是按照消费者组来接收的,Kafka确保每个分区的消息只能被同一个消费者组中的同一个消费者消费,如果想要重复消费,那么需要其他的消费者组来消费。Zookeerper中保存每个主题下的每个分区在每个消费者组中消费的offset。
新版kafka把这个offset保存到了一个__consumer_offsert
的主题下。 这个__consumer_offsert
有50个分区,通过将消费者组的id哈希值%50的值来确定要保存到那一个分区。这样也是为了考虑到Zookeeper不擅长大量数据读写的原因。
所以,如果要一个消费者组用几个消费者来同时消费Kafka中消息的话,需要多线程来读取,一个线程相当于一个消费者实例。当消费者的数量大于分区的数量时,有些消费者线程会读取不到数据。
扩展知识
这里,我们举一个例子:假设一个主题 test 被groupA消费了,现在启动另外一个新的groupB来消费test,默认test-groupB的Offset不是0,而是还是在Kafka中还没有建立这样的一个Offset,除非当test主题有数据的时候,groupB会收到该数据,该条数据也是第一条数据,此时,groupB的Offset也是刚初始化的Offset, 除非用显式的用–from-beginning 来获取从0开始的数据。
题目解答
多个Kafka消费者要想同时消费相同Topic下的相同Partition的数据,则需要将这些Kafka消费者放到不同的消费者组中。
领取福利
CSDN上私信冰河:
- 回复【并发编程】领取冰河原创全网累计下载 35W+ 的《深入理解高并发编程》电子书。
- 回复【渗透笔记】获取冰河最新发布的《冰河的渗透实战笔记》电子书。
- 回复【PDF】领取冰河原创的其他8本超硬核PDF电子书,海量面试资料和简历模板。
写在最后
如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~
推荐阅读:
好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,我是冰河,我们下期见~~
以上是关于头条二面Kafka面经总结:搞懂Kafka的这个问题,你离大厂就不远了!!(建议收藏)的主要内容,如果未能解决你的问题,请参考以下文章