1. 请简述 Kafka 的核心架构组件及作用?
核心组件:
Producer:消息生产者,支持批量、异步向 Topic 发送消息。
Broker:服务器节点,存储消息并提供读写服务,集群可横向扩展。
Consumer:消息消费者,通过消费者组订阅 Topic,构建负载均衡。
Topic:消息逻辑分类,物理由多个 Partition 组成。
Partition:最小存储单位,消息顺序写入日志文件,支持并行读写。
Replica:分区副本(默认 3 个),Leader 处理读写,Follower 同步数据并备灾。
ISR:与 Leader 同步的副本集合,确保数据可靠性,仅 ISR 成员可参与 Leader 选举。
2. 为什么 Kafka 要设计分区(Partition)?
并行处理:多分区可被不同消费者并行消费,提升吞吐量。
负载均衡:分区均匀分布在 Broker 集群,避免单节点压力过大。
水平扩展:通过增加分区数提升 Topic 存储和处理能力(需谨慎扩容)。
顺序性保障:单分区内消息按写入顺序存储,满足 “分区级有序” 需求。
3. 副本机制中,Leader 和 Follower 的职责是什么?ISR 的作用是什么?
Leader:唯一处理生产者 / 消费者的读写请求,维护分区元素材。
Follower:通过拉取机制同步 Leader 数据,Leader 故障时参与选举。
ISR:
包含 Leader 和同步滞后在阈值内(
replica.lag.time.max.ms)的 Follower。作用:确保数据可靠性,消息需被 ISR 中所有副本确认(可通过
acks配置)才算提交。
4. 消费者组(Consumer Group)的核心机制是什么?如何建立负载均衡?
核心机制:一组消费者共享 Topic 订阅,每个分区仅被组内一个消费者消费(消费者可对应多分区)。
负载均衡:
触发条件:初始化、消费者增减、分区变化时触发重平衡(Rebalance)。
过程:由 Coordinator(Broker 角色)重新分配分区 - 消费者映射(如 3 分区 + 2 消费者:消费者 1 处理分区 0/1,消费者 2 处理分区 2)。
注意:重平衡会导致消费暂停,需合理设置
session.timeout.ms(心跳超时)和heartbeat.interval.ms(心跳频率)。
5. Kafka 如何保证消息的投递语义(至少一次、最多一次、精确一次)?
至少一次(At-Least-Once):
生产者:
acks=all(等待 ISR 确认)+ 失败重试(retries>0)。消费者:先消费,后提交 offset(可能因消费失败重复消费)。
最多一次(At-Most-Once):
生产者:
acks=0(不等待确认)或不重试。消费者:先提交 offset,后消费(可能因提交后消费失败导致丢失)。
精确一次(Exactly-Once):
生产者:开启幂等性(
enable.idempotence=true)+ 事务机制(避免重复)。消费者:结合事务,将 offset 提交与消息处理绑定为原子操作(如 Kafka Streams 的
exactly_once模式)。
6. Kafka 的高吞吐能力源于哪些设计?
顺序读写:消息追加到分区日志(磁盘顺序 IO 性能接近内存)。
批量处理:生产者批量发送(
batch.size)、消费者批量拉取(fetch.min.bytes)。数据压缩:支持 GZIP/Snappy 等,批量压缩效率更高。
零拷贝:通过
sendfile系统调用直接将磁盘数据发送到网络,减少拷贝。分区并行:多分区同时读写,充分利用集群资源。
7. 如何处理 Kafka 消息积压问题?
临时扩容:增加消费者实例(需保证消费者数≤分区数,否则新增者空闲)。
优化消费逻辑:异步处理非核心流程,提升单消费者吞吐量。
调整分区数:若分区过少,新建 Topic 迁移内容实现扩容(分区数不可直接修改)。
监控预警:通过
kafka-consumer-groups.sh监控 Lag 值(消费滞后量),提前干预。
8. Kafka、RabbitMQ 与 RocketMQ 的核心区别?如何选型?
维度 | Kafka | RabbitMQ | RocketMQ |
|---|---|---|---|
吞吐量 | 高(适合 TB 级大资料场景,单节点十万级 / 秒) | 中(适合小消息,单节点万级 / 秒) | 高(支持十万级 / 秒,略低于 Kafka) |
消息可靠性 | 依赖 ISR 和持久化,配置灵活(需手动调优) | 协助镜像队列,开箱即用高可靠 | 原生支持多副本 + 同步刷盘,金融级可靠性(默认不丢消息) |
路由能力 | 轻松(Topic + 分区路由) | 复杂(交换机、绑定键、多模式:Direct/Fanout/Topic/Headers) | 中等(Topic + Tag 过滤,支持广播) |
特色功能 | 流式处理集成(Kafka Streams)、日志压缩 | 死信队列、延时交换机、插件生态丰富 | 事务消息、定时消息、重试队列(适合金融场景) |
生态成熟度 | 大数据生态无缝对接(Spark/Flink) | 开源社区活跃,客户端语言支撑广泛 | 阿里背书,国内生态完善(适配 Dubbo/Spring Cloud) |
适用场景 | 日志收集、大数据流式处理、高吞吐场景 | 业务解耦、实时通信(如订单通知)、复杂路由场景 | 金融交易(事务消息)、高可靠业务、中高吞吐场景 |
选型原则:
高吞吐、大数据量、对接流式计算 →Kafka
艰难路由、低延迟小消息、需丰富插件 →RabbitMQ
金融级可靠性、事务消息、国内分布式生态 →RocketMQ
9. 如何保证 Kafka 消息的顺序性?
分区级有序:单分区内消息按写入顺序存储和消费(天然保证)。
全局有序:
方案 1:Topic 仅设 1 个分区(牺牲吞吐量,适合低并发)。
方案 2:按 “有序键”(如用户 ID)哈希到固定分区,确保同一键的消息进入同一分区(局部有序 + 下游合并)。
10. Kafka 的日志清理策略有哪些?
删除策略(delete):按时间(
log.retention.hours)或大小(log.retention.bytes)删除过期日志。压缩策略(compact):保留每个 Key 的最新版本,适合 “更新型数据”(如用户配置)。
11. Kafka 中的 Controller 是什么?作用是什么?
定义:Broker 集群中的主节点(由 ZooKeeper 选举产生)。
作用:
管理分区 Leader 选举(如 Broker 故障时重新选举)。
同步集群元数据(分区分布、副本状态等)到所有 Broker。
12. ZooKeeper 在 Kafka 中的作用是什么?Kafka 2.8+ 有什么变化?
传统作用:
存储集群元数据(Broker 列表、Topic 分区分布)。
选举 Controller、协调重平衡。
存储消费者 offset(旧版本,已逐步废弃)。
2.8+ 变化:支持 KRaft 模式(无 ZooKeeper),元材料由 Broker 集群自行管理,提升稳定性和扩展性。
13. 消费者 offset 存储在何处?如何保证不丢失?
存储位置:
旧版本:ZooKeeper 的
/consumers/<group>/offsets/<topic>/<partition>节点。新版本:默认存储在 Kafka 内部 Topic
__consumer_offsets中(高可用,支持分区和副本)。
不丢失保障:
__consumer_offsets开启副本机制(默认 3 副本),且 offset 提交支持同步写入。
14. 什么是分区重分配?如何实现?
定义:将 Topic 分区从部分 Broker 迁移到其他 Broker(如节点扩容 / 缩容时)。
实现步骤:
用
kafka-reassign-partitions.sh生成迁移计划(JSON 格式)。执行计划,Follower 同步数据后切换 Leader,达成迁移。
15. Kafka 消息重复消费的原因是什么?如何解决?
原因:
消费者提交 offset 后崩溃,重启后重复消费。
网络波动导致生产者重试,消息重复发送。
解决:
消费端构建幂等性(如基于消息 ID 去重)。
开启生产者幂等性(
enable.idempotence=true)。
16. 如何优化 Kafka 生产者的性能?
调大
batch.size(批量发送阈值,默认 16KB)和linger.ms(等待批量的最大时间)。启用压缩(
compression.type=snappy)。增加生产者实例(多线程发送)。
合理设置
acks(非核心数据用acks=1减少等待)。
17. 如何优化 Kafka 消费者的性能?
增加消费者实例(不超过分区数)。
调大
fetch.min.bytes(批量拉取阈值)和fetch.max.wait.ms(等待批量的最大时间)。减少消费端处理耗时(如异步处理、优化业务逻辑)。
18. Kafka 中消息的最大大小限制是多少?如何调整?
默认限制:生产者端
max.request.size=1MB,Broker 端message.max.bytes=1MB。调整方式:同步增大两端参数(需注意:过大消息会降低吞吐量,建议拆分大消息)。
19. 什么是 Kafka Streams?它有什么优势?
定义:Kafka 内置的流式处理库,用于实时处理 Kafka 中的消息。
优势:
轻量级(无需单独部署集群)。
与 Kafka 无缝集成(基于 Topic 读写)。
支持精确一次语义和状态管理。
20. Kafka 如何实现跨数据中心同步?
方案 1:使用 MirrorMaker 工具(基于生产者 / 消费者,跨集群复制消息)。
方案 2:自定义同步软件,消费源集群消息并发送到目标集群。
注意:需处理网络延迟导致的同步滞后,以及双写场景下的一致性疑问。
什么?就是21. 什么是墓碑消息(Tombstone)?作用
定义:Key 存在但 Value 为 null 的消息。
作用:在日志压缩策略(compact)中,标记该 Key 的旧版本可被删除(触发清理)。
22. Kafka Broker 如何处理请求负载均衡?
分区分布:通过
log.dirs配置多目录,分区数据均匀分布在不同磁盘。请求路由:客户端直接与分区 Leader 所在 Broker 通信,避免集中访问单节点。
Controller 协调:动态调整分区分布,平衡各 Broker 的读写压力。
23. 消费者为什么会发生 Rebalance?如何避免频繁 Rebalance?
触发原因:消费者加入 / 退出、心跳超时(
session.timeout.ms)、分区数变化。避免措施:
确保消费者正常发送心跳(
heartbeat.interval.ms设为超时时间的 1/3)。避免消费者处理耗时过长(超过
max.poll.interval.ms)。使用静态成员(
group.instance.id)减少重平衡次数。
24. Kafka 如何保证数据不丢失?
生产者:
acks=all+ 重试机制 + 持久化(linger.ms合理设置)。Broker:副本机制(ISR)+ 日志持久化(
log.flush.interval.messages控制刷盘)。消费者:手动提交 offset(
enable.auto.commit=false),确保消费完成后再提交。
25. 什么是 Kafka Connect?它的作用是什么?
定义:Kafka 官方提供的连接器框架,用于在 Kafka 与外部系统(数据库、文件系统等)间同步数据。
作用:简化材料导入导出(如从 MySQL 同步数据到 Kafka,或从 Kafka 导出到 HDFS),支持分布式模式。
26. Kafka 分区的 Leader 选举机制是什么?
触发条件:Leader 所在 Broker 故障、Controller 检测到 Leader 无响应。
选举规则:从 ISR 中选择第一个副本(
unclean.leader.election.enable=false时,禁止非 ISR 副本当选,避免数据丢失)。
27. 如何监控 Kafka 集群状态?
核心指标:
Broker:分区数、副本同步率、请求延迟(
request-latency-avg)。生产者:发送成功率、批量大小、压缩率。
消费者:Lag 值(消费滞后)、重平衡次数、每秒消费消息数。
工具:JMX 暴露指标 + Grafana/Prometheus 可视化,或 Kafka 自带
kafka-topics.sh/kafka-consumer-groups.sh。
28. Kafka 支持消息回溯消费吗?如何实现?
支持:通过重置消费者 offset 实现。
方式:
命令行:
kafka-consumer-groups.sh`` --reset-offsets(指定--to-earliest/--to-timestamp等)。代码:调用
seek()方法手动设置 offset。
29. 什么是 Kafka 的幂等性生产者?如何开启?
定义:确保生产者发送的消息不重复(即使重试),通过
Producer ID(PID)和序列号实现。开启:
enable.idempotence=true(默认 false),需配合acks=all。
30. Kafka 中,为什么建议分区数不要过多?
问题:
增加 Broker 内存占用(每个分区需维护元信息)。
重平衡耗时增加(分区越多,分配逻辑越复杂)。
记录句柄占用过多(每个分区对应多个日志文件)。
建议:根据集群规模合理设置(单 Broker 分区数通常不超过 1000)。
31. 如何搭建 Kafka 消息的延时投递?
方案 1:使用延时队列 Topic(如按延迟时间分 Topic:
delay_10s、delay_1m),消费者定时拉取。方案 2否到期。就是:借助外部组件(如 RabbitMQ 延时交换机),或自定义定时器检测消息
注意:Kafka 无原生延时队列,需通过业务层完成。
32. Kafka 集群扩容时,如何迁移分区?
步骤:
用
kafka-reassign-partitions.sh生成包含新 Broker 的迁移计划。执行计划,Follower 副本在新 Broker 同步数据。
同步完成后,Controller 将 Leader 切换到新 Broker(可选)。
注意:迁移期间不影响读写,但可能短暂增加延迟。
总结:Kafka 面试核心围绕 “可靠性(副本 / ISR)、性能(分区 / 批量)、扩展性(消费者组 / 集群)、运维实践(监控 / 迁移)”,理解底层机制比死记答案更核心。
#Kafka #面试指南 #消息队列
浙公网安备 33010602011771号