首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
龚拓新
蚂蚁集团_研发工程师
发布于上海
关注
已关注
取消关注
@江西陈胖子:
一天吃透Kafka面试八股文
Kafka 都有哪些特点?高吞吐量、低延迟: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和 Flink本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~********如果访问不了Github,可以访问*******。*******Kafka 的设计架构你知道吗?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,表示消息写入成功。给大家分享一个Github仓库,上面有大彬整理的300多本经典的计算机书籍PDF,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~********讲一下你使用 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 单个分区的有序性。如果要保证删除分区数据插入到其他分区保证有序性,那么实现起来逻辑就会非常复杂。
点赞 9
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
03-27 16:21
复旦大学 Python
AI infra应该学什么?
AI Infra 是未来 5–10 年非常确定的岗位方向之一,而且相比纯算法岗,门槛更工程化、需求更大、年龄更友好。AI Infra 技能栈你可以把技能栈理解为 4 层:第1层:基础工程能力(必须)这是门槛:LinuxPython / Go计算机网络操作系统DockerKubernetes数据库(MySQL / Redis)分布式系统基础API开发(FastAPI / Flask)并发 / 异步 / 队列(Kafka / RabbitMQ)这一层本质是:后端工程师能力第2层:AI工程能力这一层开始进入 AI Infra:PyTorch 基础模型推理(inference)模型部署(TorchSe...
从事AI岗需要掌握哪些技...
点赞
评论
收藏
分享
03-30 04:41
三江学院 游戏策划
游戏策划准备在春招吃尾气了
个人曾因为在秋招期间忙于个人项目,没时间找实习,现在春招被卡学历了,大伙帮忙看看简历有没有能改动的地方?前情提要;个人在传奇行业从小做到大,从初中到现在大学即将毕业已经有八年时间了,赚也赚了个二三十万,现在不知道从哪下手修改简历/找工作,跟同龄人相比我的经验和专业水平高一点,同时也兼顾独游制作开发,秋招的时候忙着赚钱就没找实习,现在有点不知道怎么下手了,虽然个人在传奇圈也算一员猛将,但是终究是想做更多彩的游戏。说起跟传奇的渊源,最开始还是因为家长喜欢玩,把我也给带起来了,后面我就尝试自己做了,没想到转眼间已经要毕业了,大学期间虽然经济资源没差过,但是除了传奇之外没有其他项目经验,是不是我也变成...
简历中的项目经历要怎么写
点赞
评论
收藏
分享
03-24 14:04
门头沟学院 Web前端
不是我应聘个it技术支持岗位4-6k 还学历歧视上了😭
点赞
评论
收藏
分享
03-11 18:26
凯里学院 前端工程师
能看看简历有啥问题嘛,一个找不到工作的女二本前端碎掉了
是因为学院二本的原因嘛,一个公司都不要,想去个大点的公司好困难,只能继续在小小小公司干着了
你感受到金三银四了嘛?
点赞
评论
收藏
分享
昨天 17:24
科大讯飞_教育BG_后端开发(准入职员工)
我通过 vibe coding 实现了二手交易系统
首先我们需要了解一下什么是 vibe coding?Vibe Coding = 用「话」指挥 AI 写代码,快速出原型、边跑边改,沉浸在开发心流中。Vibe:指「氛围、感觉、意图、风格、效果」—— 你要什么功能、什么风格、什么约束。Coding:由 LLM(GPT-4/Claude/Cursor/Copilot)自动生成、修复、优化代码。你的角色:从「代码打字员」→ 产品经理 + 架构师 + 测试 + 验收官。二手交易系统后台项目链接https://gitee.com/zxj2022/second-hand-trading-platform#你都用vibe coding做过什么?#
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
恒生电子笔试已燃尽
7611
2
...
AIcoding上线了!你确定不来刷刷?
7507
3
...
钉钉Java暑期一面
7404
4
...
双非春秋招3月总结与收获
6220
5
...
我放弃互联网大厂了。。
6149
6
...
4.1 美团后端暑期实习面经
5915
7
...
京东零售平台产品与研发中心一面
5207
8
...
恒生电子笔试
5158
9
...
春招面了四十多场,焚绝在此
4856
10
...
如何把面试主动权握在手里?Ai岗面试焚诀!
4575
创作者周榜
更多
正在热议
更多
#
面试被问到不会的问题,你怎么应对?
#
14064次浏览
216人参与
#
你都用vibe coding做过什么?
#
11199次浏览
499人参与
#
开放七大实习专项,百度暑期实习值得冲吗
#
37807次浏览
634人参与
#
你觉得大几开始实习最合适?
#
17343次浏览
197人参与
#
uu们,春招你还来吗?
#
54298次浏览
345人参与
#
你见过哪些招聘隐形歧视?
#
13559次浏览
127人参与
#
招商银行数字金融训练营
#
105056次浏览
889人参与
#
AI Coding实战技巧
#
8684次浏览
202人参与
#
做完笔试后你收到面试了吗?
#
17353次浏览
186人参与
#
你现在一天AI几次?
#
7252次浏览
103人参与
#
恒生电子笔试
#
18560次浏览
148人参与
#
哪些公司在招寒假实习?
#
89192次浏览
757人参与
#
Vibe Coding 会干掉初级岗位吗?
#
13896次浏览
180人参与
#
面试中,你被问过哪些奇葩问题?
#
92608次浏览
926人参与
#
大厂实习和小厂实习最大的区别是什么?
#
28715次浏览
214人参与
#
如果人生可以debug你会改哪一行?
#
6243次浏览
113人参与
#
面试吐槽bot
#
185257次浏览
903人参与
#
哪个瞬间让你对大厂祛魅了?
#
591765次浏览
3725人参与
#
牛友の3月总结
#
18492次浏览
167人参与
#
找工作,你会甘心进小厂还是猛冲大厂
#
873153次浏览
6985人参与
#
Claude Code泄露源码
#
9589次浏览
122人参与
#
25届网易互娱暑实进度
#
102180次浏览
782人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务