Kafka高频面试题及参考答案(京东网易知乎等多家面经汇总)
介绍下 Kafka,Kafka 的作用、组件、适用场景分别是什么?作为消息队列,它可解决什么样的问题?
Kafka 是一个 分布式流处理平台,最初由 LinkedIn 开发,后成为 Apache 顶级项目。它以 高吞吐量、低延迟、可扩展性 为核心优势,专为处理实时数据流而设计。
核心作用
- 消息系统:作为 消息中间件,支持生产者和消费者之间的异步通信。
- 数据管道:用于构建 实时数据集成管道,例如将数据从数据库同步到数据仓库。
- 流处理:结合流处理框架(如 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 采用 分布式发布-订阅模型,核心架构包括:
- 生产者集群:向多个 Topic 推送数据。
- Broker 集群:每个 Broker 存储部分 Partition 数据,通过副本机制保障高可用。
- 消费者集群:以 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 故障处理
- 检测故障:Zookeeper 或 Controller 监控 Broker 状态。
- 选举新 Leader:从 ISR(同步副本列表)中选择新的 Leader。
- 恢复服务:生产者/消费者自动切换到新 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 的工作原理是什么?如何保证数据不丢失、不重复?
工作原理
- 生产者推送:消息按分区策略发送到 Broker 的 Leader Partition。
- 副本同步:Leader 将数据复制到 Follower(ISR 内)。
- 消费者拉取:消费者从 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 的消息进入同一分区。
- 自定义策略:业务可自行实现分区逻辑(如按地理位置分配)。
保证数据可靠性
- 多副本机制:每个分区设置多个副本(如 replication factor=3),数据写入 Leader 后同步到 Follower。
- ACK 确认机制:生产者设置
acks=all
,确保所有 ISR 副本写入成功后才返回确认。 - 最小同步副本数:通过
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 可以灵活切换模式: 单消费者组 → 队列模式(竞争消费)。多消费者组 → 发布订阅模式(广播消费)。
消费者组工作机制
- 分区分配:消费者加入组时,由 Coordinator 分配 Partition(策略包括 Range、RoundRobin、Sticky)。
- 负载均衡:组内消费者数量与 Partition 数量匹配时,每个消费者处理固定 Partition。
- 再平衡(Rebalance):消费者增减或故障时,重新分配 Partition,期间服务短暂不可用。
Kafka 的 offset 管理是怎样的?为什么同一个消费者组的消费者不能消费相同的分区?
Offset 管理机制
- 存储位置: 旧版本依赖 Zookeeper,新版本使用内部 Topic __consumer_offsets,按 Group ID 和 Partition 存储 Offset。
- 提交方式: 自动提交:定期提交(可能重复或丢失数据)。手动提交:业务处理完成后调用 commitSync() 或 commitAsync()。
同组消费者禁止消费相同分区
- 设计目标:避免重复消费,保证消息处理的并行性和顺序性。
- 分配原则:每个 Partition 只能被组内一个消费者独占消费。
- 例外场景:若消费者数量超过 Partition 数,多余消费者将处于闲置状态。
如果有一条 offset 对应的数据,消费完成之后,手动提交失败,如何处理?正在消费一条数据时 Kafka 挂了,重启以后,消费的 offset 是哪一个?
手动提交失败处理
- 重试提交:在代码中捕获提交异常,加入重试逻辑(如指数退避)。
- 业务补偿:若消息处理是幂等的,可允许重复消费。
- 记录状态:将 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 写入流程可以拆解为几个关键步骤:
- 数据序列化:将消息 Key 和 Value 按配置的序列化方式(如 Avro、JSON)转换为字节流。
- 选择分区:根据分区策略(轮询、哈希、自定义)确定目标 Partition。
- 批次聚合:消息不会立即发送,而是按
linger.ms
(等待时间)和batch.size
(批次大小)参数累积成批次,提升吞吐量。 - 发送至 Broker:批次数据通过网络发送到对应 Partition 的 Leader Broker。
- ACK 确认:Broker 根据 ACK 配置返回确认信号,生产者决定是否重试。
ACK 参数类型
0 |
不等待确认,直接发送下一条消息。 |
高吞吐但容忍数据丢失(如日志采集)。 |
1 |
Leader 写入本地日志即返回确认。 |
平衡可靠性与性能(默认配置)。 |
all(-1) |
所有 ISR 副本写入成功后才确认。 |
要求高可靠性(如金融交易)。 |
ACK 机制解决的问题:
- 数据丢失风险:通过副本写入确认降低消息丢失概率。
- 一致性保障:控制数据在集群中的副本同步级别。
Kafka 读取消息是推还是拉的模式,有什么好处?如何实现高吞吐?
Kafka 采用 消费者主动拉取(Pull) 模式,而非服务端推送(Push)。
拉模式的优势
- 消费速率可控:消费者根据自身处理能力拉取数据,避免被压垮。
- 批量处理:通过
max.poll.records
配置单次拉取消息数量,提升处理效率。 - 减少无效推送:消费者离线时,服务端无需维护推送状态。
实现高吞吐的关键手段
- 分区并行:多个消费者同时读取不同 Partition,横向扩展消费能力。
- 零拷贝技术:使用
sendfile
系统调用,减少内核态与用户态数据拷贝。 - 批量压缩:生产者端对批次数据压缩(如 Snappy、GZIP),降低网络传输量。
- 高效存储:消息按顺序追加到磁盘,利用页缓存加速读写。
说下 Kafka 中的 Partition?数据是如何备份的?存的数据格式是什么样的?
Partition 核心概念
- 物理分片:每个 Topic 被划分为多个 Partition,分布在不同 Broker。
- 有序性保证:Partition 内部消息严格按写入顺序存储,支持顺序读写。
- 扩展性基础:通过增加 Partition 数量提升 Topic 的吞吐能力。
数据备份机制
- 副本(Replica):每个 Partition 配置多个副本(如 replication factor=3)。
- Leader-Follower 模型: Leader:处理所有读写请求。Follower:从 Leader 异步或同步拉取数据,保持数据同步。
- ISR 列表:仅处于同步状态的副本可被选为 Leader。
数据存储格式
- 日志分段:Partition 对应一个目录,数据按
segment.bytes
切分为多个日志文件(如 0000000000.log)。 - 索引文件:每个日志段附带
.index
(偏移量索引)和.timeindex
(时间戳索引)文件,加速消息查找。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
17年+码农经历了很多次面试,多次作为面试官面试别人,多次大数据面试和面试别人,深知哪些面试题是会被经常问到。 在多家企业从0到1开发过离线数仓实时数仓等多个大型项目,详细介绍项目架构等企业内部秘不外传的资料,介绍踩过的坑和开发干货,分享多个拿来即用的大数据ETL工具,让小白用户快速入门并精通,指导如何入职后快速上手。 计划更新内容100篇以上,包括一些企业内部秘不外宣的干货,欢迎订阅!