面试必问 | 聊聊Kafka的消费模型?

开发 架构 Kafka
最近,有些读者去头条二面,被面试官问了一个关于Kafka的问题:多个Kafka消费者如何同时消费相同Topic下的相同Partition的数据? 看似一个简单的问题,竟然把这位读者问懵了!

[[442172]]

大家好,我是冰河~~

最近,有些读者去头条二面,被面试官问了一个关于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中消息的话,可以使用多线程来读取消息,一个线程相当于一个消费者实例。当消费者的数量大于分区的数量时,有些消费者线程会读取不到数据。

扩展知识

这里,我们举一个例子:假设一个主题 testTopic 被groupA消费了,现在启动另外一个新的groupB来消费testTopic,默认testTopic-groupB的Offset不是0,而是在Kafka中还没有建立这样的一个Offset。

除非当testTopic 主题有数据的时候,groupB会收到该数据,该条数据也是第一条数据,此时,groupB的Offset并不是从0开始的,而是从刚初始化的Offset开始的, 除非显式的用–from-beginning 来获取从0开始的数据。

题目解答

多个Kafka消费者要想同时消费相同Topic下的相同Partition的数据,则需要将这些Kafka消费者放到不同的消费者组中。

好了,今天就到这儿吧,我是冰河,我们下期见~~

本文转载自微信公众号「冰河技术」,可以通过以下二维码关注。转载本文请联系冰河技术公众号。

 

责任编辑:武晓燕 来源: 冰河技术
相关推荐

2021-12-09 12:22:28

MyBatis流程面试

2021-12-06 11:03:57

JVM性能调优

2023-06-07 08:08:43

JVM内存模型

2023-02-03 07:24:49

双亲委派模型

2020-07-28 08:59:22

JavahreadLocal面试

2019-03-15 19:41:39

MySQL面试数据库

2024-01-05 14:20:55

MySQL索引优化器

2020-11-05 13:12:47

红黑树

2021-12-13 11:12:41

Spring事务失效

2023-02-06 07:01:51

2020-10-14 09:04:18

Kafka系统通信

2020-09-29 15:24:07

面试数据结构Hashmap

2020-02-18 14:25:51

Java线程池拒绝策略

2020-10-12 18:00:39

JavaAQS代码

2023-02-17 08:02:45

@Autowired@Resource

2023-02-01 07:15:16

2021-04-26 17:23:21

JavaCAS原理

2021-09-08 10:42:45

前端面试性能指标

2023-02-15 07:03:41

跨域问题面试安全

2023-07-03 08:17:44

JUC工具代码
点赞
收藏

51CTO技术栈公众号