Kafka高频面试题及参考答案(京东网易知乎等多家面经汇总)

介绍下 Kafka,Kafka 的作用、组件、适用场景分别是什么?作为消息队列,它可解决什么样的问题?

Kafka 是一个 分布式流处理平台,最初由 LinkedIn 开发,后成为 Apache 顶级项目。它以 高吞吐量、低延迟、可扩展性 为核心优势,专为处理实时数据流而设计。

核心作用

  1. 消息系统:作为 消息中间件,支持生产者和消费者之间的异步通信。
  2. 数据管道:用于构建 实时数据集成管道,例如将数据从数据库同步到数据仓库。
  3. 流处理:结合流处理框架(如 Kafka Streams、Flink),实现实时数据处理和分析。

核心组件

Producer

向 Kafka 发布数据的客户端,负责将数据写入指定 Topic。

Broker

Kafka 集群中的单个节点,负责存储数据、处理读写请求。

Topic

逻辑上的数据分类,生产者按 Topic 发送数据,消费者按 Topic 订阅数据。

Partition

Topic 的物理分片,每个 Partition 是有序、不可变的消息序列,支持并行处理。

Consumer Group

一组消费者共同消费一个 Topic,每个 Partition 只能被组内一个消费者消费。

Zookeeper

早期版本用于管理集群元数据、Broker 注册、Leader 选举,新版已逐步移除依赖。

适用场景

  • 日志收集:集中收集分布式系统的日志数据(如 ELK 架构)。
  • 实时指标:监控系统实时生成指标(如用户行为跟踪)。
  • 事件溯源:记录系统状态变更事件(如电商订单状态流转)。
  • 流处理:实时处理点击流、传感器数据等。

解决的问题

  • 系统解耦:生产者和消费者无需直接通信,降低依赖性。
  • 削峰填谷:缓冲突发流量,避免下游系统过载。
  • 顺序保证:通过 Partition 内消息顺序性,支持需要严格顺序的业务场景。
  • 水平扩展:通过增加 Partition 和 Broker,轻松应对数据量增长。

说下 Kafka 架构、特点、优缺点,与其它消息组件相比有什么好处?

架构概览

Kafka 采用 分布式发布-订阅模型,核心架构包括:

  1. 生产者集群:向多个 Topic 推送数据。
  2. Broker 集群:每个 Broker 存储部分 Partition 数据,通过副本机制保障高可用。
  3. 消费者集群:以 Consumer Group 形式消费数据,支持水平扩展。

核心特点

  • 高吞吐:单机可支持每秒百万级消息写入(依赖硬件配置)。
  • 持久化存储:数据按需保留到磁盘,支持 TB 级数据累积。
  • 水平扩展:通过增加 Partition 和 Broker 实现扩容。
  • 多副本机制:每个 Partition 有多个副本,确保数据不丢失。

优缺点对比

高吞吐量和低延迟

单条消息延迟可能不如内存队列(如 Redis)

数据持久化能力强

配置复杂(如副本数、ISR 机制)

支持海量数据堆积

消费者需要自行管理 Offset(旧版本)

与其他消息组件的对比

RabbitMQ

适合复杂路由、事务消息,但吞吐量低于 Kafka。

ActiveMQ

支持 JMS 规范,但扩展性和吞吐量较弱。

RocketMQ

阿里系产品,功能更贴近 Kafka,但在事务消息上更成熟。

核心优势

  • 持久化与吞吐量:适合需要长期存储、高吞吐的场景。
  • 流式处理生态:与 Flink、Spark Streaming 等深度集成。

阐述 Kafka 生产者与消费者相关概念,如分区容错性、消费端的数据一致性、leader 挂掉之后处理方法

生产者相关

  • 分区策略:生产者决定将消息发送到 Topic 的哪个 Partition。常见策略包括:轮询(默认):均匀分配消息。Key Hash:按消息 Key 的哈希值分配到固定 Partition,保证相同 Key 的消息顺序性。
  • 容错性:通过 多副本机制 实现。每个 Partition 有多个副本(Leader 和 Follower),Leader 负责读写,Follower 同步数据。

消费者相关

  • 数据一致性:At Most Once:消息可能丢失,但不会重复。At Least Once:消息可能重复,但不会丢失(默认模式)。Exactly Once:通过事务机制保证消息仅处理一次(需 Kafka 0.11+)。
  • Offset 管理:消费者需定期提交 Offset(消费位置),若提交失败可能导致重复消费。

Leader 故障处理

  1. 检测故障:Zookeeper 或 Controller 监控 Broker 状态。
  2. 选举新 Leader:从 ISR(同步副本列表)中选择新的 Leader。
  3. 恢复服务:生产者/消费者自动切换到新 Leader,短暂不可用(通常毫秒级)。

说下 Kafka 的 ISR 机制、选举机制,ISR、OSR 和 ACK 分别是什么,ACK 有几种值?

ISR 机制

  • ISR(In-Sync Replicas):与 Leader 数据同步的副本集合。
  • OSR(Out-of-Sync Replicas):滞后于 Leader 的副本,可能因网络或宕机脱离 ISR。
  • AR(Assigned Replicas):所有副本(ISR + OSR)。

触发条件

  • Follower 副本与 Leader 的 消息差值时间差值 超过阈值时,移出 ISR。

选举机制

  • Controller 角色:某个 Broker 被选举为 Controller,负责 Partition 的 Leader 选举。
  • 优先副本选举:优先选择 ISR 中的第一个副本作为 Leader,减少数据不一致风险。

ACK 参数

ACK 表示生产者需要收到的确认信号:

  • 0:无需确认,可能丢失数据。
  • 1:Leader 写入成功即确认(默认)。
  • all(-1):所有 ISR 副本写入成功才确认,数据最安全。

Kafka 的工作原理是什么?如何保证数据不丢失、不重复?

工作原理

  1. 生产者推送:消息按分区策略发送到 Broker 的 Leader Partition。
  2. 副本同步:Leader 将数据复制到 Follower(ISR 内)。
  3. 消费者拉取:消费者从 Broker 拉取消息,按 Offset 顺序处理。

数据不丢失

  • 生产者端: 设置 acks=all,确保所有 ISR 副本写入成功。启用重试机制(retries=MAX_VALUE)。
  • Broker 端: 多副本机制,避免单点故障。定期刷盘(flush.messages 和 flush.ms 参数)。
  • 消费者端: 关闭自动提交 Offset,处理完消息再手动提交。

数据不重复

  • 生产者幂等性: 启用 enable.idempotence=true,通过唯一 ID 和序列号去重。
  • 消费者端: 实现业务逻辑幂等(如数据库唯一键)。使用 Kafka 事务(需配合 isolation.level=read_committed)。

Kafka 分区策略有哪些?如何尽可能保证数据可靠性?数据丢失怎么处理?如何保证全局有序?

分区策略是生产者决定将消息写入哪个分区的核心逻辑,直接影响数据分布和系统性能。常见的策略包括:

  • 轮询策略:默认策略,消息依次分配到不同分区,确保负载均衡。
  • 哈希策略:根据消息 Key 的哈希值分配到特定分区,保证相同 Key 的消息进入同一分区。
  • 自定义策略:业务可自行实现分区逻辑(如按地理位置分配)。

保证数据可靠性

  1. 多副本机制:每个分区设置多个副本(如 replication factor=3),数据写入 Leader 后同步到 Follower。
  2. ACK 确认机制:生产者设置 acks=all,确保所有 ISR 副本写入成功后才返回确认。
  3. 最小同步副本数:通过 min.insync.replicas 参数控制 ISR 最小副本数,避免单点故障导致数据丢失。

数据丢失处理

  • 生产者端: 启用重试机制(retries=Integer.MAX_VALUE),避免因网络抖动导致消息未发送。使用幂等生产者(enable.idempotence=true),防止重复发送。
  • Broker 端: 定期检查副本同步状态,及时剔除故障副本并重新选举 Leader。配置 unclean.leader.election.enable=false,禁止非 ISR 副本成为 Leader。
  • 消费者端: 手动提交 Offset,确保消息处理完成后再提交,避免消息丢失。

全局有序性

Kafka 仅保证分区内有序,全局有序需通过以下方式实现:

  • 单分区写入:所有消息写入同一分区,牺牲并行性。
  • 业务层排序:消费者拉取多个分区数据后按时间戳或序列号排序(可能引入延迟)。

生产者消费者模式与发布订阅模式在 Kafka 中的异同点是什么?Kafka 的消费者组是如何消费数据的?

模式对比

生产者-消费者(队列)

消息被一个消费者处理,适用于任务分发。

同一消费者组内多个消费者共享一个 Topic,每个 Partition 仅由一个消费者处理。

发布-订阅

消息广播给所有订阅者,适用于日志分发。

不同消费者组独立消费同一 Topic,每个组获取完整数据副本。

核心差异

  • 消费者组的存在使得 Kafka 可以灵活切换模式: 单消费者组 → 队列模式(竞争消费)。多消费者组 → 发布订阅模式(广播消费)。

消费者组工作机制

  1. 分区分配:消费者加入组时,由 Coordinator 分配 Partition(策略包括 Range、RoundRobin、Sticky)。
  2. 负载均衡:组内消费者数量与 Partition 数量匹配时,每个消费者处理固定 Partition。
  3. 再平衡(Rebalance):消费者增减或故障时,重新分配 Partition,期间服务短暂不可用。

Kafka 的 offset 管理是怎样的?为什么同一个消费者组的消费者不能消费相同的分区?

Offset 管理机制

  • 存储位置: 旧版本依赖 Zookeeper,新版本使用内部 Topic __consumer_offsets,按 Group ID 和 Partition 存储 Offset。
  • 提交方式: 自动提交:定期提交(可能重复或丢失数据)。手动提交:业务处理完成后调用 commitSync() 或 commitAsync()。

同组消费者禁止消费相同分区

  • 设计目标:避免重复消费,保证消息处理的并行性和顺序性。
  • 分配原则:每个 Partition 只能被组内一个消费者独占消费。
  • 例外场景:若消费者数量超过 Partition 数,多余消费者将处于闲置状态。

如果有一条 offset 对应的数据,消费完成之后,手动提交失败,如何处理?正在消费一条数据时 Kafka 挂了,重启以后,消费的 offset 是哪一个?

手动提交失败处理

  1. 重试提交:在代码中捕获提交异常,加入重试逻辑(如指数退避)。
  2. 业务补偿:若消息处理是幂等的,可允许重复消费。
  3. 记录状态:将 Offset 与业务结果一起存储到数据库,通过事务保证一致性。

Kafka 重启后的 Offset 恢复

  • 提交策略决定 Offset: 若手动提交失败,消费者重启后会从最后一次成功提交的 Offset 开始消费,导致已处理但未提交的消息被重复消费。若使用自动提交,可能因提交周期未到而丢失部分 Offset。

Kafka 支持什么语义,怎么实现 Exactly Once?消费者和消费者组有什么区别,为什么需要消费者组?

消息语义

  • At Most Once:消息可能丢失,但不会重复(ACK=0)。
  • At Least Once:消息可能重复,但不会丢失(ACK=1 或 all,默认模式)。
  • Exactly Once:消息仅处理一次,需结合以下机制: 生产者幂等性:通过唯一 PID 和序列号去重。事务机制:跨生产者和消费者的原子操作(isolation.level=read_committed)。

消费者 vs 消费者组

  • 消费者:单个进程或线程,负责从指定 Partition 拉取数据。
  • 消费者组:多个消费者组成的逻辑单元,实现: 并行消费:组内消费者共同处理一个 Topic 的多个 Partition。负载均衡:动态分配 Partition 以应对消费者增减。容错性:某个消费者故障时,其处理的 Partition 会被重新分配。

需要消费者组的原因

  • 横向扩展消费能力,适应高吞吐场景。
  • 支持多种消费模式(队列或发布订阅)。

Kafka producer 的写入数据过程是怎样的?ack 设置有哪些,ack 机制解决了什么问题?

Producer 写入流程可以拆解为几个关键步骤:

  1. 数据序列化:将消息 Key 和 Value 按配置的序列化方式(如 Avro、JSON)转换为字节流。
  2. 选择分区:根据分区策略(轮询、哈希、自定义)确定目标 Partition。
  3. 批次聚合:消息不会立即发送,而是按 linger.ms(等待时间)和 batch.size(批次大小)参数累积成批次,提升吞吐量。
  4. 发送至 Broker:批次数据通过网络发送到对应 Partition 的 Leader Broker。
  5. ACK 确认:Broker 根据 ACK 配置返回确认信号,生产者决定是否重试。

ACK 参数类型

0

不等待确认,直接发送下一条消息。

高吞吐但容忍数据丢失(如日志采集)。

1

Leader 写入本地日志即返回确认。

平衡可靠性与性能(默认配置)。

all(-1)

所有 ISR 副本写入成功后才确认。

要求高可靠性(如金融交易)。

ACK 机制解决的问题

  • 数据丢失风险:通过副本写入确认降低消息丢失概率。
  • 一致性保障:控制数据在集群中的副本同步级别。

Kafka 读取消息是推还是拉的模式,有什么好处?如何实现高吞吐?

Kafka 采用 消费者主动拉取(Pull) 模式,而非服务端推送(Push)。

拉模式的优势

  • 消费速率可控:消费者根据自身处理能力拉取数据,避免被压垮。
  • 批量处理:通过 max.poll.records 配置单次拉取消息数量,提升处理效率。
  • 减少无效推送:消费者离线时,服务端无需维护推送状态。

实现高吞吐的关键手段

  1. 分区并行:多个消费者同时读取不同 Partition,横向扩展消费能力。
  2. 零拷贝技术:使用 sendfile 系统调用,减少内核态与用户态数据拷贝。
  3. 批量压缩:生产者端对批次数据压缩(如 Snappy、GZIP),降低网络传输量。
  4. 高效存储:消息按顺序追加到磁盘,利用页缓存加速读写。

说下 Kafka 中的 Partition?数据是如何备份的?存的数据格式是什么样的?

Partition 核心概念

  • 物理分片:每个 Topic 被划分为多个 Partition,分布在不同 Broker。
  • 有序性保证:Partition 内部消息严格按写入顺序存储,支持顺序读写。
  • 扩展性基础:通过增加 Partition 数量提升 Topic 的吞吐能力。

数据备份机制

  1. 副本(Replica):每个 Partition 配置多个副本(如 replication factor=3)。
  2. Leader-Follower 模型: Leader:处理所有读写请求。Follower:从 Leader 异步或同步拉取数据,保持数据同步。
  3. ISR 列表:仅处于同步状态的副本可被选为 Leader。

数据存储格式

  • 日志分段:Partition 对应一个目录,数据按 segment.bytes 切分为多个日志文件(如 0000000000.log)。
  • 索引文件:每个日志段附带 .index(偏移量索引)和 .timeindex(时间戳索引)文件,加速消息查找。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

17年+码农经历了很多次面试,多次作为面试官面试别人,多次大数据面试和面试别人,深知哪些面试题是会被经常问到。 在多家企业从0到1开发过离线数仓实时数仓等多个大型项目,详细介绍项目架构等企业内部秘不外传的资料,介绍踩过的坑和开发干货,分享多个拿来即用的大数据ETL工具,让小白用户快速入门并精通,指导如何入职后快速上手。 计划更新内容100篇以上,包括一些企业内部秘不外宣的干货,欢迎订阅!

全部评论

相关推荐

科大讯飞2025届春招面经汇总(技术岗+非技术岗)1. 技术岗(Java/大数据/算法方向)面试流程:笔试 → 技术一面 → 技术二面 → HR面笔试:编程题(2道,********中等难度,如动态规划、图论)八股文(数据库、操作系统、网络)项目相关(如Redis缓存优化、JWT认证)技术一面(1小时):Java基础:HashMap vs ConcurrentHashMap(底层结构、线程安全)JUC包工具类(如AQS、线程池)JWT结构及安全性问题数据库:MySQL索引优化(B+树 vs Hash索引)优惠券超卖问题(分布式锁实现方案)系统设计:设计一个延迟订单取消系统(定时任务 vs 消息队列)技术二面(1小时):项目深挖:介绍一个高并发项目(如秒杀系统)如何优化SQL查询性能?算法题:手撕代码:合并K个有序链表(优先队列实现)时间复杂度分析及优化场景题:如何设计一个实时数据仓库(Flink+Kafka)HR面(30分钟):职业规划、加班接受度、期望薪资2. 产品运营岗面试流程:群面 → 业务面 → HR面群面(案例分析):设计一个AI教育产品的推广方案讨论用户增长策略(如K12市场)业务面(45分钟):项目经历:在团队中的职责、遇到的困难及解决方案最有成就感的一件事(需量化结果)行业洞察:如何看待AI+教育的发展趋势?如何发现用户需求?(用户调研/数据分析)HR面(30分钟):个人优缺点、为什么选择科大讯飞?3. 测试工程师岗面试流程:笔试 → 技术一面 → 技术二面技术一面:测试基础:白盒测试 vs 黑盒测试单元测试框架(如JUnit)编程题:手写一个二分查找算法操作系统:进程 vs 线程(通信方式)技术二面:项目相关:如何设计自动化测试框架?遇到过哪些Bug?如何定位?场景题:如何测试一个语音识别系统?💡 面试建议1. 技术岗:刷题:********高频题(动态规划、链表、二叉树)八股文:重点复习JUC、MySQL索引、分布式锁项目复盘:准备1-2个高并发/大数据项目,突出优化点2. 非技术岗:熟悉科大讯飞业务(如AI教育、医疗)准备用户增长/产品运营案例分析3. 反问环节:可问团队技术栈、新人培养计划🌟 科大讯飞面试特点技术岗:偏重底层原理(如HashMap红黑树转换)非技术岗:关注行业洞察与执行力HR面:可能涉及加班文化(部分岗位需接受弹性工作制)内推链接:https://campus.iflytek.com?refrenceCode=BB37621内推码:BB37621 #内推#                                                                                                     #内推码#                                                                                                     #提前批#                                                                                                     #25届春招#                                                  
点赞 评论 收藏
分享
来实时更新面经了。一面完当晚联系的第二天二面。流程大概40分钟,纯聊天无手撕。有关维度建模和关系建模的东西,在叙述的时候有点问题,被面试官指出来了。总之是害得练。1. 自我介绍2. 你这个数仓项目是什么性质的(自爆是尚硅谷练手)3. 研究生主要做的是什么东西(讲了讲课题相关内容,面试官还有些追问)4. 说说数据库执行sql的底层流程5. 处于什么目的做的这个项目(指数仓项目)6. 了解什么数据组件,都是干什么的7. 你对数仓分层的一些理解8. 你提到了事实表,那事实表都有哪些种类9. 实体建模和维度建模的区别(这里回答的不好,有些问题被面试官指出来了)10. 做这个项目中,遇到什么难点11. 你提到了数据倾斜,你了解哪些数据倾斜12. 我看你主要找数据类的工作,那你都了解哪些数据相关的工作呢13. 本科怎么选择跨校考研的14. 问了问简历上的竞赛情况15. 我看你参加过一个开源的活动,讲一下16. 说说mapreduce和spark的区别17. 又问了问课题组的方向18. 开放性问题:现在技术迭代很快,你如何保证自己的技术更新呢19. 你提到使用大模型辅助学习,有什么实际案例吗20. 反问最后问面试官有没有什么建议,面试官说要多投多面,希望还能有后续吧。#牛客AI配图神器##淘天暑期实习##数据仓库##数据研发#
查看19道真题和解析
点赞 评论 收藏
分享
04-08 20:18
已编辑
苏州大学 数据仓库
点赞 评论 收藏
分享
评论
8
46
分享

创作者周榜

更多
牛客网
牛客企业服务