首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
龚拓新
蚂蚁集团_研发工程师
发布于上海
关注
已关注
取消关注
@程序员大彬:
Kafka高频面试题总结(2022年最新)
本文已经收录到github仓库,此仓库用于分享互联网大厂高频面试题,包括Java基础、多线程、MySQL、缓存、Spring、Springboot、MyBatis、消息队列、分布式、微服务等等,面试必备!欢迎大家star!github地址:https://github.com/Tyson0314/Java-learning如果github访问不了,可以访问gitee仓库。gitee地址:https://gitee.com/tysondai/Java-learningKafka 都有哪些特点?高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。可扩展性:kafka集群支持热扩展持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)高并发:支持数千个客户端同时读写请简述下你在哪些场景下会选择 Kafka?日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、HBase、Solr等。消息系统:解耦和生产者和消费者、缓存消息等。用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。流式处理:比如spark streaming和 FlinkKafka 的设计架构你知道吗?Kafka 架构分为以下几个部分:Producer :消息生产者,就是向 kafka broker 发消息的客户端。Consumer :消息消费者,向 kafka broker 取消息的客户端。Topic :可以理解为一个队列,一个 Topic 又分为一个或多个分区,Consumer Group:这是 kafka 用来实现一个 topic 消息的广播(发给所有的 consumer)和单播(发给任意一个 consumer)的手段。一个 topic 可以有多个 Consumer Group。Broker :一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker上,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的id(offset)。将消息发给 consumer,kafka 只保证按一个 partition 中的消息的顺序,不保证一个 topic 的整体(多个 partition 间)的顺序。Offset:kafka 的存储文件都是按照 offset.kafka 来命名,用 offset 做名字的好处是方便查找。例如你想找位于 2049 的位置,只要找到 2048.kafka 的文件即可。当然 the first offset 就是 00000000000.kafka。Kafka 分区的目的?分区对于 Kafka 集群的好处是:实现负载均衡。分区对于消费者来说,可以提高并发度,提高效率。你知道 Kafka 是如何做到消息的有序性?kafka 中的每个 partition 中的消息在写入时都是有序的,而且单独一个 partition 只能由一个消费者去消费,可以在里面保证消息的顺序性。但是分区之间的消息是不保证有序的。Kafka Producer 的执行过程?1,Producer生产消息 --> 2,从Zookeeper找到Partition的Leader --> 3,推送消息 --> 4,通过ISR列表通知给Follower --> 5, Follower从Leader拉取消息,并发送ack --> 6,Leader收到所有副本的ack,更新Offset,并向Producer发送ack,表示消息写入成功。讲一下你使用 Kafka Consumer 消费消息时的线程模型,为何如此设计?Thread-Per-Consumer Model,这种多线程模型是利用Kafka的topic分多个partition的机制来实现并行:每个线程都有自己的consumer实例,负责消费若干个partition。各个线程之间是完全独立的,不涉及任何线程同步和通信,所以实现起来非常简单。请谈一谈 Kafka 数据一致性原理一致性就是说不论是老的 Leader 还是新选举的 Leader,Consumer 都能读到一样的数据。假设分区的副本为3,其中副本0是 Leader,副本1和副本2是 follower,并且在 ISR 列表里面。虽然副本0已经写入了 Message4,但是 Consumer 只能读取到 Message2。因为所有的 ISR 都同步了 Message2,只有 High Water Mark 以上的消息才支持 Consumer 读取,而 High Water Mark 取决于 ISR 列表里面偏移量最小的分区,对应于上图的副本2,这个很类似于木桶原理。这样做的原因是还没有被足够多副本复制的消息被认为是“不安全”的,如果 Leader 发生崩溃,另一个副本成为新 Leader,那么这些消息很可能丢失了。如果我们允许消费者读取这些消息,可能就会破坏一致性。试想,一个消费者从当前 Leader(副本0) 读取并处理了 Message4,这个时候 Leader 挂掉了,选举了副本1为新的 Leader,这时候另一个消费者再去从新的 Leader 读取消息,发现这个消息其实并不存在,这就导致了数据不一致性问题。当然,引入了 High Water Mark 机制,会导致 Broker 间的消息复制因为某些原因变慢,那么消息到达消费者的时间也会随之变长(因为我们会先等待消息复制完毕)。延迟时间可以通过参数 replica.lag.time.max.ms 参数配置,它指定了副本在复制消息时可被允许的最大延迟时间。ISR、OSR、AR 是什么?ISR:In-Sync Replicas 副本同步队列OSR:Out-of-Sync ReplicasAR:Assigned Replicas 所有副本ISR是由leader维护,follower从leader同步数据有一些延迟(具体可以参见 图文了解 Kafka 的副本复制机制),超过相应的阈值会把 follower 剔除出 ISR, 存入OSR(Out-of-Sync Replicas )列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。LEO、HW、LSO、LW等分别代表什么LEO:是 LogEndOffset 的简称,代表当前日志文件中下一条HW:水位或水印(watermark)一词,也可称为高水位(high watermark),通常被用在流式处理领域(比如Apache Flink、Apache Spark等),以表征元素或事件在基于时间层面上的进度。在Kafka中,水位的概念反而与时间无关,而是与位置信息相关。严格来说,它表示的就是位置信息,即位移(offset)。取 partition 对应的 ISR中 最小的 LEO 作为 HW,consumer 最多只能消费到 HW 所在的位置上一条信息。LSO:是 LastStableOffset 的简称,对未完成的事务而言,LSO 的值等于事务中第一条消息的位置(firstUnstableOffset),对已完成的事务而言,它的值同 HW 相同LW:Low Watermark 低水位, 代表 AR 集合中最小的 logStartOffset 值。数据传输的事务有几种?数据传输的事务定义通常有以下三种级别:(1)最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输(2)最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输.(3)精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被Kafka 消费者是否可以消费指定分区消息?Kafa consumer消费消息时,向broker发出fetch请求去消费特定分区的消息,consumer指定消息在日志中的偏移量(offset),就可以消费从这个位置开始的消息,customer拥有了offset的控制权,可以向后回滚去重新消费之前的消息,这是很有意义的。Kafka消息是采用Pull模式,还是Push模式?Kafka最初考虑的问题是,customer应该从brokes拉取消息还是brokers将消息推送到consumer,也就是pull还push。在这方面,Kafka遵循了一种大部分消息系统共同的传统的设计:producer将消息推送到broker,consumer从broker拉取消息。一些消息系统比如Scribe和Apache Flume采用了push模式,将消息推送到下游的consumer。这样做有好处也有坏处:由broker决定消息推送的速率,对于不同消费速率的consumer就不太好处理了。消息系统都致力于让consumer以最大的速率最快速的消费消息,但不幸的是,push模式下,当broker推送的速率远大于consumer消费的速率时,consumer恐怕就要崩溃了。最终Kafka还是选取了传统的pull模式。Pull模式的另外一个好处是consumer可以自主决定是否批量的从broker拉取数据。Push模式必须在不知道下游consumer消费能力和消费策略的情况下决定是立即推送每条消息还是缓存之后批量推送。如果为了避免consumer崩溃而采用较低的推送速率,将可能导致一次只推送较少的消息而造成浪费。Pull模式下,consumer就可以根据自己的消费能力去决定这些策略。Pull有个缺点是,如果broker没有可供消费的消息,将导致consumer不断在循环中轮询,直到新消息到t达。为了避免这点,Kafka有个参数可以让consumer阻塞知道新消息到达(当然也可以阻塞知道消息的数量达到某个特定的量这样就可以批量发Kafka 高效文件存储设计特点Kafka把topic中一个parition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。通过索引信息可以快速定位message和确定response的最大大小。通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作。通过索引文件稀疏存储,可以大幅降低index文件元数据占用空间大小Kafka创建Topic时如何将分区放置到不同的Broker中副本因子不能大于 Broker 的个数;第一个分区(编号为0)的第一个副本放置位置是随机从 brokerList 选择的;其他分区的第一个副本放置位置相对于第0个分区依次往后移。也就是如果我们有5个 Broker,5个分区,假设第一个分区放在第四个 Broker 上,那么第二个分区将会放在第五个 Broker 上;第三个分区将会放在第一个 Broker 上;第四个分区将会放在第二个 Broker 上,依次类推;剩余的副本相对于第一个副本放置位置其实是由 nextReplicaShift 决定的,而这个数也是随机产生的谈一谈 Kafka 的再均衡在Kafka中,当有新消费者加入或者订阅的topic数发生变化时,会触发Rebalance(再均衡:在同一个消费者组当中,分区的所有权从一个消费者转移到另外一个消费者)机制,Rebalance顾名思义就是重新均衡消费者消费。Rebalance的过程如下:第一步:所有成员都向coordinator发送请求,请求入组。一旦所有成员都发送了请求,coordinator会从中选择一个consumer担任leader的角色,并把组成员信息以及订阅信息发给leader。第二步:leader开始分配消费方案,指明具体哪个consumer负责消费哪些topic的哪些partition。一旦完成分配,leader会将这个方案发给coordinator。coordinator接收到分配方案之后会把方案发给各个consumer,这样组内的所有成员就都知道自己应该消费哪些分区了。所以对于Rebalance来说,Coordinator起着至关重要的作用Kafka 是如何实现高吞吐率的?Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写入速度低容量大的硬盘,以此来换取更强的存储能力,但实际上,使用硬盘并没有带来过多的性能损失。kafka主要使用了以下几个方式实现了超高的吞吐率:顺序读写;零拷贝文件分段批量发送数据压缩。Kafka 缺点?由于是批量发送,数据并非真正的实时;对于mqtt协议不支持;不支持物联网传感数据直接接入;仅支持统一分区内消息有序,无法实现全局消息有序;监控不完善,需要安装插件;依赖zookeeper进行元数据管理;Kafka 新旧消费者的区别旧的 Kafka 消费者 API 主要包括:SimpleConsumer(简单消费者) 和 ZookeeperConsumerConnectir(高级消费者)。SimpleConsumer 名字看起来是简单消费者,但是其实用起来很不简单,可以使用它从特定的分区和偏移量开始读取消息。高级消费者和现在新的消费者有点像,有消费者群组,有分区再均衡,不过它使用 ZK 来管理消费者群组,并不具备偏移量和再均衡的可操控性。现在的消费者同时支持以上两种行为,所以为啥还用旧消费者 API 呢?Kafka 分区数可以增加或减少吗?为什么?我们可以使用 bin/kafka-topics.sh 命令对 Kafka 增加 Kafka 的分区数据,但是 Kafka 不支持减少分区数。Kafka 分区数据不支持减少是由很多原因的,比如减少的分区其数据放到哪里去?是删除,还是保留?删除的话,那么这些没消费的消息不就丢了。如果保留这些消息如何放到其他分区里面?追加到其他分区后面的话那么就破坏了 Kafka 单个分区的有序性。如果要保证删除分区数据插入到其他分区保证有序性,那么实现起来逻辑就会非常复杂。
点赞 10
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
昨天 16:23
门头沟学院 前端工程师
七牛云前端面经-凉
个人优势,劣势(我说我话少内向,做事情专注是优势,话少内向,沟通方面有所欠缺是劣势,面试官说我就是主动性不高)为什么实习三个月就离职了,为什么不续签(我总不能说我不喜欢这家公司就离职了吧,我就说合同签的三个月)能实习多久(JD上写4个月我就说了4个月)讲讲实习,先介绍一下业务,你做了什么,遇到那些困难,怎么解决的(从来没准备过这种问题,答得磕磕绊绊)用过哪些AI工具(我以为说AI编辑器呢,我说Trae,又问我还有没有其他的)日程生活学习种用这些AI工具做什么 (润色文档内容,增强代码)为什么不用chatgpt,cloude (花钱,翻墙)平常有什么爱好(我说我喜欢看文学作品,本来想说没有的,但...
查看12道真题和解析
点赞
评论
收藏
分享
09-28 19:15
景德镇陶瓷大学 C++
献祭华为😈😈
迷茫的大四🐶:
💐孝子启动失败,改为启动咏鹅
点赞
评论
收藏
分享
10-29 11:31
深圳虾皮信息科技有限公司_后端开发(实习员工)
幽默后端
点赞
评论
收藏
分享
昨天 20:47
游鲨_内容运营
北京游戏公司人数增减【游鲨文档】
2024年北京游戏行业,游鲨共统计到约1300个主体、370家公司(包含北京游戏公司、以及其他城市游戏公司的北京分部),社保总人数约5万人,相比2023年减少约1800人。(以上数据仅包括社保人数≥10的北京公司)人数减少🪂比较多的公司有(p1、p2):完美世界竞技世界贝塔科技卓越工坊趣加永星互动龙创悦动攸乐科技英雄游戏乐动卓越华清飞扬闲徕互娱光宇游戏360游戏畅聊天下巴别时代开天创世王牌互娱明日世界北京默契破冰蔚领时代九鼎无双云畅游戏雷霆瀚海多点科技目标在线心光流美百度多酷博乐科技人数增加🛗比较多的公司有(p18、p17):途游游戏北京迦游米可世界腾讯IEG元点互动江娱互动猩球科技天龙互...
国内游戏公司介绍
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
java后端学习经验分享(大三进大厂版)
4418
2
...
数字马力笔试结果
3975
3
...
十一月,希望有个好的开始
3100
4
...
26届双非本拿下美团SSP的真实感受
2844
5
...
真完蛋,我大抵是要毕业即失业了
2472
6
...
本硕985文科女秋招 0 offer深夜有感
2414
7
...
企鹅后端日常实习一面
2257
8
...
双非0offer
2013
9
...
中信银行信用卡中心面经
1649
10
...
秋招笔面记录
1637
创作者周榜
更多
正在热议
更多
#
秋招开始捡漏了吗
#
14613次浏览
77人参与
#
今年秋招还有金九银十吗
#
18070次浏览
134人参与
#
“vivo”个offer
#
46825次浏览
310人参与
#
秋招,不懂就问
#
332178次浏览
1986人参与
#
辞职后的日常
#
15844次浏览
84人参与
#
上班后,才发现大学__白学了
#
2481次浏览
22人参与
#
满帮集团求职进展汇总
#
8242次浏览
71人参与
#
打工人的精神状态
#
101401次浏览
1309人参与
#
分享一个让你热爱工作的瞬间
#
43623次浏览
395人参与
#
上班到公司第一件事做什么?
#
99028次浏览
681人参与
#
学历对求职的影响
#
550758次浏览
3904人参与
#
实习期间如何提升留用概率?
#
190130次浏览
1606人参与
#
一人一个landing小技巧
#
127818次浏览
1463人参与
#
我和mentor的爱恨情仇
#
79555次浏览
434人参与
#
学历or实习经历,哪个更重要
#
192691次浏览
1026人参与
#
海信求职进展汇总
#
85245次浏览
408人参与
#
秋招结束之后的日子
#
100306次浏览
1011人参与
#
被同事甩锅了怎么办
#
25476次浏览
100人参与
#
数字马力求职进展汇总
#
212294次浏览
1679人参与
#
和mentor 1on1 都聊什么?
#
4195次浏览
22人参与
#
你见过哪些工贼行为
#
32407次浏览
151人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务