理解数据如何流动并充分发挥其潜力,已成为现代组织的关键能力。Kafka 是当今应用版图中用于摄取、存储与处理实时数据流的领先平台。
在本文中,我们将梳理一些 Kafka 面试题,并探讨该工具在数据处理中的关键角色。我们会按层次覆盖从基础到进阶的面试问题,并提供有效备考建议。若您是 Kafka 新手,务必查看我们的 Introduction to Apache Kafka 课程。
基础 Kafka 面试题
这些问题将考查您对 Kafka 作为数据工程工具的基本理解。
1. 什么是 Apache Kafka?
Apache Kafka 是一个强大的开源分布式事件流平台。它最初由 LinkedIn 作为消息队列开发,后来演进为可在多种场景下处理数据流的工具。
Kafka 的分布式系统架构支持横向扩展,使消费者能够按自身节奏读取消息,同时也便于为集群新增 Kafka 节点(服务器)。
Kafka 旨在以低延迟快速处理海量数据。尽管其以 Scala 和 Java 编写,但支持多种编程语言。

Apache Kafka 充当分布式日志收集器,日志消息以键值对的形式存储在仅追加日志文件中,实现持久的长期存储与检索。不像 RabbitMQ 等传统消息队列在消息被消费后即删除,Kafka 会在可配置的保留期内保留消息,因此非常适合需要数据重放或事件溯源的用例。
RabbitMQ 注重实时消息投递而不做长期存储,而 Kafka 的保留策略则支持更复杂的数据驱动型应用。
Kafka 的常见用例包括应用追踪、日志聚合与消息传递,但它不具备传统数据库的查询与索引功能。其优势在于处理实时数据流,因此在分布式系统与实时分析中不可或缺。
2. Kafka 有哪些特性?
Apache Kafka 是广泛用于构建实时数据管道和流式应用的开源分布式流平台。其特性包括:
1. 高吞吐
Kafka 能处理海量数据,设计上可高效从源客户端进行数百 GB 的读写。
2. 分布式架构
Apache Kafka 采用以集群为中心的架构,原生支持跨 Kafka 服务器进行消息分区。该设计也使得在消费者机器集群中实现分布式消费成为可能,同时保证每个分区内消息的顺序。此外,Kafka 集群可弹性、透明地扩展,无需停机。
3. 支持多种客户端
Apache Kafka 支持集成来自不同平台的客户端,如 .NET、JAVA、PHP 和 Python。
4. 实时消息
Kafka 产生的实时消息应对消费者可见;这对复杂事件处理系统至关重要。

Apache Kafka 消息分布式系统。(作者制图)
3. Kafka 的分区如何工作?
在 Kafka 中,主题(topic)是存放生产者所有消息的存储空间。通常,会将相关的数据分别存放在不同主题中。例如,名为 "transactions" 的主题可存储电商网站的用户购买详情,而名为 "customers" 的主题则可存放客户信息。
主题会被划分为若干分区。默认情况下,一个主题只有一个分区,但您可以配置为更多。消息会分布到这些分区中,每个分区都有自己的位移(offset),并存放在 Kafka 集群的不同服务器上。
例如,若某主题在三个代理(broker)上有三个分区,而生产者发送 15 条消息,消息将按顺序分布:
- 记录 1 进入分区 0
- 记录 2 进入分区 1
- 记录 3 进入分区 2
之后循环往复,记录 4 回到分区 0,依此类推。
4. 为什么选择 Kafka 而非其他消息服务?
在需要高吞吐与实时数据处理的用例中,选择 Kafka 往往取决于其独特优势。Kafka 的突出之处在于:
- 高吞吐与可扩展性:Kafka 能高效处理海量数据。其架构支持横向扩展,您可以增加更多代理与分区来应对不断增长的数据负载,而不牺牲性能。
- 实时处理:非常适合实时数据流,如行为跟踪与运营监控。例如,LinkedIn 创建 Kafka 以承载其活动跟踪管道,实时发布用户点击、点赞等交互的动态。
- 消息重放:当消费者出错或过载时,Kafka 允许其重放消息,确保不丢数据——消费者可恢复并重放遗漏消息以维持数据完整性。
- 持久性与容错:该工具会在多个代理间复制数据,即使部分代理故障也能保证可靠性。这种容错设计确保数据可访问,为关键业务提供保障。
5. 解释 Apache Kafka 提供的所有 API。
API(应用程序编程接口)用于不同服务、微服务与系统之间的通信。Kafka 提供一套 API,用于构建事件流平台并与其消息系统交互。
Kafka 的核心 API 包括:
- Producer API:用于将实时数据发送到 Kafka 主题。生产者决定每条消息应进入主题中的哪个分区,并通过回调处理发送操作的成功或失败。
- Consumer API:用于从 Kafka 主题读取实时数据。消费者可加入消费者组以进行负载均衡与并行处理,订阅主题并持续轮询 Kafka 获取新消息。
- Streams API:支持在 Kafka 内构建实时应用,对数据进行转换、聚合与分析。它提供高级 DSL(领域特定语言)来定义复杂的流处理逻辑。
- Kafka Connect API:用于创建和运行可复用的连接器,在 Kafka 与外部系统之间导入和导出数据。
- Admin API:提供管理和配置 Kafka 主题、代理及其他资源的工具,以确保平稳运行与可扩展性。
这些 API 使 Kafka 内的数据生产、消费、处理与管理无缝衔接。
中级 Kafka 面试题
这些问题面向已较为熟悉 Kafka 用途的从业者。
6. 增加 Kafka 主题分区数量会带来哪些影响?
增加 Kafka 主题的分区数量可通过允许更多消费者并行读取来提升并发与吞吐。但同时也会带来一些挑战:
- 集群开销增加:更多分区会消耗更多集群资源,复制产生的网络流量增大,存储需求也会提升。
- 潜在的数据不均衡:分区增多后,数据可能分布不均,一些分区过载而另一些未充分利用。
- 更复杂的消费者组管理:分区增多会使消费者组分配与位移跟踪更复杂。
- 更长的再均衡时间:当消费者加入或离开时,跨组的分区再均衡会耗时更久,影响系统整体响应性。
7. 解释 Kafka 架构的四个组件
Kafka 是由多个关键组件构成的分布式架构:
代理节点(Broker nodes)
Kafka 的分布式架构由多个关键组件组成,其中之一是代理节点。代理负责繁重的 I/O 操作,并管理消息的持久化存储。它们接收来自生产者的数据、进行存储并提供给消费者读取。每个代理都是 Kafka 集群的一部分,并有唯一 ID 以便协调。
在较早版本的 Kafka 中,集群通过 Zookeeper 管理,负责代理间协调并跟踪诸如分区位置等元数据(尽管 Kafka 正在转向内部的 KRaft 模式)。Kafka 代理具有高度可扩展性,能够在分布式系统中处理海量的消息读写请求。
ZooKeeper 节点
ZooKeeper 在 Kafka 中扮演关键角色,负责管理代理注册并选举 Kafka 控制器,该控制器处理集群的管理操作。ZooKeeper 自身以集群(ensemble)的形式运行,多进程协作以确保任一时刻仅有一个代理被指派为控制器。
若当前控制器发生故障,ZooKeeper 会迅速选举新的代理接替。尽管 ZooKeeper 曾是 Kafka 架构的重要组成部分,Kafka 正在过渡至无需 ZooKeeper 的 KRaft 模式。ZooKeeper 是一个独立的开源项目,并非 Kafka 原生组件。
生产者
Kafka 生产者是作为数据源的客户端应用,通过与代理建立持久的 TCP 连接,将记录发布到一个或多个 Kafka 主题。
多个生产者可并发向同一主题发送记录。Kafka 主题是仅追加的,这意味着生产者可以写入新数据,但无论是生产者还是消费者都不能修改或删除已有记录,从而保证数据不可变性。
消费者
Kafka 消费者是订阅一个或多个 Kafka 主题来消费记录流的客户端应用。消费者通常以消费者组的形式工作,将读取与处理记录的负载分配给多个消费者。
每个消费者通过维护位移来跟踪其在流中的进度,确保不会重复处理数据且未处理的记录不会丢失。Kafka 消费者是数据管道的最后一步,记录在此被处理或转发至下游系统。

Apache Kafka 架构示意图(作者制图)
8. Kafka 中日志压缩(log compaction)的主要目的是什么?它对消费者性能有何影响?
Kafka 中日志压缩的主要目标是为主题日志中的每个唯一键保留其最新值,从而确保数据的最新状态得以保存并减少存储占用。这样一来,消费者无需处理较早的重复数据即可更高效地获取当前值。
与 Kafka 传统的基于时间的保留策略(在一定时间后删除消息)不同,日志压缩只会对每个键删除较旧记录,始终保留该键的最新值。该特性在维持消费者可获取当前状态的同时,保持更紧凑的日志,进而提升存储效率并加快查找。
9. Kafka 集群中的分区(Partitions)与副本(Replicas)有何区别?
分区与副本是 Kafka 架构的关键组成部分,兼顾性能与容错。分区通过将主题拆分为多个部分来提升吞吐,使消费者可以并行从不同分区读取,从而增强 Kafka 的可扩展性与效率。
副本则通过在多个代理间创建分区副本来提供冗余。这确保了容错:当主导代理(负责该分区读写操作的代理)发生故障时,某个跟随副本可被提升为新的主导者接管。
Kafka 为每个分区维护多个副本以确保高可用与数据持久性,最大限度降低故障期间的数据丢失风险,尽管完整的持久性仍取决于复制相关设置。
10. Kafka 中的模式(schema)是什么?它对分布式系统为何重要?
在 Kafka 中,模式定义了数据的结构与格式,例如字段 CustomerID(整数)、CustomerName(字符串)与 Designation(字符串)。
在 Kafka 这类分布式系统中,生产者与消费者必须就数据格式达成一致,才能避免交换数据时出现错误。Kafka 的 Schema Registry 负责管理并强制执行这些模式,确保生产者与消费者使用兼容版本。
Schema Registry 存储模式(常见格式包括 Avro、Protobuf 或 JSON Schema),并支持模式演进,使数据格式可在不破坏现有消费者的情况下发生变化。这样在模式演进时也能确保数据交换顺畅与系统可靠。

Schema Registry 如何与生产者/消费者协同(作者制图)
高级 Kafka 面试题
对于资深的 Kafka 用户,您可能会面对更具技术深度的面试题。
11. Kafka 如何防止消息丢失?
Kafka 通过多种机制防止消息丢失并确保可靠投递:
- 手动提交位移:消费者可关闭自动提交位移,并在成功处理消息后手动提交,以避免在消费者崩溃时丢失未处理的消息。
- 生产者确认(
acks=all):在生产者端设置 acks=all,可确保消息在被视为写入成功前,已获得所有同步副本的确认,从而降低代理故障导致的丢失风险。
- 复制(
min.insync.replicas 与 replication.factor):Kafka 会将每个分区的数据复制到多个代理。复制因子大于 1 提供容错能力,即便某个代理宕机,数据仍可在其他代理上可用。min.insync.replicas 设置确保在写入前至少有一定数量的副本确认,从而提升数据持久性。例如,复制因子为 3 时,即使一个代理宕机,数据仍保留在另外两个代理上。
- 生产者重试:将重试次数配置为较高值,确保在瞬时故障时生产者会重试发送。与
max.in.flight.requests.per.connection=1 等谨慎配置组合使用,可降低消息乱序的概率,确保消息最终被投递且不丢失。
12. Kafka 与 RabbitMQ 有何不同?
Kafka 与 RabbitMQ 是两种常见的消息系统,在架构与用法上存在差异。它们在关键方面的对比如下:
1. 用途与设计
Kafka 面向大规模数据流与实时管道,针对高吞吐与低延迟进行了优化。其基于日志的架构确保持久性并支持数据重处理,适用于事件溯源与流处理等用例。
RabbitMQ 是通用消息代理,支持复杂路由,通常用于微服务之间的消息传递或在工作者之间分发任务。它在需要可靠消息投递、灵活路由与服务间交互的环境中表现出色。
2. 架构
Kafka 将消息按主题分类,并划分为分区。每个分区可由多个消费者处理,实现并行处理与扩展。数据以可配置的保留期存储在磁盘上,既保证持久性,又可在需要时重放消息。
RabbitMQ 将消息发送到队列,由一个或多个消费者进行消费。它通过消息确认、重试与死信交换机来确保可靠投递,重点关注消息完整性与路由灵活性。
3. 性能与可扩展性
Kafka 通过增加更多代理与分区实现横向扩展,可处理每秒数百万条消息。其架构支持并行处理与高吞吐,非常适合大规模数据流场景。
RabbitMQ 也可扩展,但在应对超大规模数据量时不及 Kafka 高效。它适用于中到高吞吐场景,但并非为 Kafka 那样的极致吞吐型流应用而优化。
总结:Kafka 与 RabbitMQ 都是强大的消息工具,但适用场景不同。Kafka 适合高吞吐、实时数据流与事件溯源等需要大规模并行处理的应用。
RabbitMQ 适合可靠消息投递、微服务架构中的任务分发以及复杂消息路由。在需要服务解耦、异步处理与可靠性的场景中表现突出。
13. Kafka 如何助力微服务应用开发?
Apache Kafka 在构建微服务架构方面价值突出,得益于其实时数据处理、事件驱动通信与可靠消息传递能力。Kafka 对微服务开发的支持体现在:
1. 事件驱动架构
- 服务解耦:Kafka 让服务通过事件通信而非直接调用,降低相互依赖。服务可独立地产生与消费事件,便于演进与维护。
- 异步处理:服务可发布事件后立即继续处理,无需等待其他服务响应,从而提升系统响应性与效率。
2. 可扩展性
- 横向扩展:Kafka 通过在多个代理与分区间分摊负载来处理海量数据。不同分区可由不同消费者实例处理,实现横向扩展。
- 并行消费:多个消费者可同时从不同分区读取,提高吞吐与性能。
3. 可靠性与容错
- 数据复制:Kafka 在多个代理间复制数据,确保高可用与容错。若某代理失败,另一个可使用其副本接管。Kafka 将数据存于磁盘,且保留期可配置,确保事件不丢失并可在必要时重处理。
4. 数据集成
- 中央数据枢纽:Kafka 作为微服务架构中的数据流枢纽,促进多种数据源与接收端的集成,简化跨服务的数据一致性维护。
- Kafka Connect:Kafka Connect 提供连接器,将 Kafka 与众多数据库、键值存储、搜索索引及其他系统对接,简化微服务与外部系统之间的数据流动。
14. 什么是 Kafka 的 Zookeeper?它如何工作?
Apache ZooKeeper 是一个开源服务,用于在分布式系统中协调与管理配置数据、同步与组服务。在旧版本的 Kafka 中,ZooKeeper 在管理元数据、领导者选举与代理协调方面发挥关键作用。
不过,自 2.8 版起 Kafka 已开始过渡到 KRaft 模式,无需 ZooKeeper。ZooKeeper 现被视为过时组件,并将在预计于 2024 年发布的 4.0 版本中被移除。
ZooKeeper 以名为“znode”的分层节点结构存储数据,每个 znode 均可存放元数据并拥有子 znode,类似文件系统。该结构对维护 Kafka 代理、主题与分区相关的元数据至关重要。ZooKeeper 通过基于法定人数(quorum)的机制确保一致性:多数节点必须就变更达成一致,从而具备高可靠与容错性。
在旧版 Kafka 中,ZooKeeper 用于以下关键功能:
- 领导者选举:ZooKeeper 选举控制器节点,负责分区领导者分配与其他集群级任务。
- 代理元数据管理:维护活动代理及其状态的集中式注册表。
- 分区重分配:在故障或集群扩容期间,协助管理跨代理的分区再均衡。
ZooKeeper 的 ZAB 协议(ZooKeeper Atomic Broadcast)在发生网络分区时也能保证节点间一致性,从而确保 Kafka 的容错能力。尽管 KRaft 成为默认模式后 Kafka 将更少依赖 ZooKeeper,但其一致性与可靠性曾对管理 Kafka 的分布式特性至关重要。
15. 如何降低 Kafka 的磁盘使用?
Kafka 提供多种有效降低磁盘使用的方法。关键策略包括:
1. 调整日志保留设置
修改日志保留策略以减少消息在磁盘上的保留时长。可通过调整 retention.ms(基于时间的保留)或 retention.bytes(基于大小的保留)来限制 Kafka 在删除旧消息前存储的时间或数据量。
2. 实施日志压缩
使用日志压缩仅保留每个唯一键的最新消息,移除过时或冗余数据。若只需最新状态,这一方式尤为有效,在不丢失关键信息的情况下显著降低磁盘占用。
3. 配置清理策略
根据用例设置合适的清理策略。可同时配置基于时间(retention.ms)与基于大小(retention.bytes)的保留策略,以自动删除旧消息并控制磁盘占用。
4. 启用消息压缩
在生产者端启用消息压缩,例如使用 GZIP、Snappy 或 LZ4。压缩可减小消息尺寸,从而降低磁盘占用。但需权衡压缩/解压带来的 CPU 开销。
5. 调整日志段大小
通过配置 日志段大小(segment.bytes)来控制滚动日志段的频率。较小的段大小可更频繁地滚动,有助于更高效地释放旧数据以节省磁盘空间。
6. 删除不必要的主题或分区
定期检查并删除未使用或不必要的主题与分区。这将释放磁盘空间并帮助控制 Kafka 的磁盘占用。
面向数据工程师的 Kafka 面试题
如果您正在应聘数据工程师岗位,建议重点准备以下 Kafka 面试问题。
16. Kafka 中的领导者副本与跟随者副本有何区别?
领导者副本
领导者副本处理所有客户端的读写请求。它管理分区状态,是生产者与消费者交互的主要入口。若领导者发生故障,其角色会转移给某个跟随者副本以维持可用性。
跟随者副本
跟随者副本从领导者进行数据复制,但不直接处理客户端请求。其职责是通过保持分区数据的最新副本来确保容错。从 Kafka 2.4 起,在特定条件下,跟随者副本也可处理读请求,以分摊负载并提升读取吞吐。若领导者故障,将从跟随者中选举新的领导者,以维持数据一致性与可用性。
17. 为什么在 Kafka 中要使用集群?有哪些好处?
Kafka 集群由多个代理组成,将数据分布至多个实例,从而在不停机的情况下实现可扩展性。这些集群旨在将延迟降至最低,若主集群故障,其他 Kafka 集群可接管以维持服务连续性。
Kafka 集群的架构包括主题、代理、生产者与消费者。它高效管理数据流,非常适合大数据应用与数据驱动型应用的开发。
18. Kafka 如何保证消息有序?
Kafka 主要通过两种方式保证消息有序:
- 使用消息键:当消息被指定键时,具有相同键的所有消息都会被发送至同一分区。由于 Kafka 保证分区内的顺序,这能确保相同键的消息按接收顺序被处理。
- 单线程的消费者处理:为保持顺序,消费者应以单线程处理来自某一分区的消息。若使用多线程,可为每个分区建立独立的内存队列,确保并发处理时仍按正确顺序消费。
19. 在 Kafka 中,ISR 与 AR 分别代表什么?什么是 ISR 扩容?
ISR(in-sync replicas,同步副本)
ISR 指与领导者副本完全同步的副本。这些副本拥有最新数据,被视为可可靠用于读写操作。
AR(assigned replicas,已分配副本)
AR 包含分配给某分区的所有副本,既包括同步副本也包括不同步副本。它表示该分区的完整副本集合。
ISR 扩容
当新的副本追上领导者并被加入 ISR 列表时,即发生 ISR 扩容。这会增加最新副本的数量,提升容错与可靠性。
20. Kafka 中的零拷贝(zero-copy)使用场景是什么?
Kafka 使用零拷贝高效地在生产者与消费者之间传输海量数据。它利用 FileChannel.transferTo 方法将数据直接从文件系统传输至网络套接字,无需额外拷贝,从而提升性能与吞吐。
该技术还利用内存映射文件(mmap)读取索引文件,使用户态与内核态共享数据缓冲,进一步减少额外拷贝。这使 Kafka 非常适合高效处理大规模实时数据流。
备战您的 Kafka 面试
在准备以 Kafka 为重点的数据工程面试时,既要夯实技术基础,也要清楚了解 Kafka 如何融入现代系统。Kafka 是许多实时数据平台的核心,面试官会期望您既掌握基础知识,也了解其在可扩展、具容错环境中的工作方式。
重点关注领域
结合本文覆盖的 Kafka 面试题,您需要重点复习以下领域:
- 架构:能自信讲解 Kafka 架构,包括代理、分区,以及生产者与消费者之间的交互。您还应能解释 Kafka 的消息投递保障——如“至少一次”或“恰好一次”投递——以及通过同步副本(ISR)等特性保证消息有序的机制。
- 集成:了解 Kafka 如何借助 Kafka Connect 等工具与其他系统集成(连接数据库、键值存储等)。面试官可能会询问 Kafka 在微服务或分布式系统中维持数据一致性的作用。
- 监控与故障排查:熟悉 Kafka Manager、Prometheus 等监控工具。您需要展示管理与优化 Kafka 集群的能力。
- 问题解决:准备好设计能解决真实问题的消息方案,如处理大流量数据或确保消息可靠性。面试官可能会给出假设场景,要求您对 Kafka 性能进行排障或优化。
- 沟通表达:Kafka 较为复杂,您需要能清晰地向技术团队或业务方解释设计决策或排障步骤。良好沟通能力将让您脱颖而出。
- 实战经验:强调您的实践经历,例如搭建 Kafka 集群、管理数据保留策略,或将 Kafka 与其他工具集成。实践经验非常重要。
- 持续学习:关注 Kafka 的最新特性与最佳实践。阅读文档或参与开源贡献能体现您对持续学习的投入。
面试小贴士
以下建议可助您在面试中脱颖而出:
- 研究目标公司、行业与面试官背景。
- 为不同环节(技术、HR、电话、现场)准备相应策略。
- 定期复习技术资源,例如:
通过打磨这些能力并充分准备,您将更从容地应对与 Kafka 相关的面试。请记住,面试官不仅看重技术专长,也重视清晰表达与解决实际问题的能力。全程展现您对数据工程的热情。
理解数据如何流动并充分发挥其潜力,已成为现代组织的关键能力。Kafka 是当今应用版图中用于摄取、存储与处理实时数据流的领先平台。
在本文中,我们将梳理一些 Kafka 面试题,并探讨该工具在数据处理中的关键角色。我们会按层次覆盖从基础到进阶的面试问题,并提供有效备考建议。若您是 Kafka 新手,务必查看我们的 Introduction to Apache Kafka 课程。
基础 Kafka 面试题
这些问题将考查您对 Kafka 作为数据工程工具的基本理解。
1. 什么是 Apache Kafka?
Apache Kafka 是一个强大的开源分布式事件流平台。它最初由 LinkedIn 作为消息队列开发,后来演进为可在多种场景下处理数据流的工具。
Kafka 的分布式系统架构支持横向扩展,使消费者能够按自身节奏读取消息,同时也便于为集群新增 Kafka 节点(服务器)。
Kafka 旨在以低延迟快速处理海量数据。尽管其以 Scala 和 Java 编写,但支持多种编程语言。
Apache Kafka 充当分布式日志收集器,日志消息以键值对的形式存储在仅追加日志文件中,实现持久的长期存储与检索。不像 RabbitMQ 等传统消息队列在消息被消费后即删除,Kafka 会在可配置的保留期内保留消息,因此非常适合需要数据重放或事件溯源的用例。
RabbitMQ 注重实时消息投递而不做长期存储,而 Kafka 的保留策略则支持更复杂的数据驱动型应用。
Kafka 的常见用例包括应用追踪、日志聚合与消息传递,但它不具备传统数据库的查询与索引功能。其优势在于处理实时数据流,因此在分布式系统与实时分析中不可或缺。
2. Kafka 有哪些特性?
Apache Kafka 是广泛用于构建实时数据管道和流式应用的开源分布式流平台。其特性包括:
1. 高吞吐
Kafka 能处理海量数据,设计上可高效从源客户端进行数百 GB 的读写。
2. 分布式架构
Apache Kafka 采用以集群为中心的架构,原生支持跨 Kafka 服务器进行消息分区。该设计也使得在消费者机器集群中实现分布式消费成为可能,同时保证每个分区内消息的顺序。此外,Kafka 集群可弹性、透明地扩展,无需停机。
3. 支持多种客户端
Apache Kafka 支持集成来自不同平台的客户端,如 .NET、JAVA、PHP 和 Python。
4. 实时消息
Kafka 产生的实时消息应对消费者可见;这对复杂事件处理系统至关重要。
Apache Kafka 消息分布式系统。(作者制图)
3. Kafka 的分区如何工作?
在 Kafka 中,主题(topic)是存放生产者所有消息的存储空间。通常,会将相关的数据分别存放在不同主题中。例如,名为 "transactions" 的主题可存储电商网站的用户购买详情,而名为 "customers" 的主题则可存放客户信息。
主题会被划分为若干分区。默认情况下,一个主题只有一个分区,但您可以配置为更多。消息会分布到这些分区中,每个分区都有自己的位移(offset),并存放在 Kafka 集群的不同服务器上。
例如,若某主题在三个代理(broker)上有三个分区,而生产者发送 15 条消息,消息将按顺序分布:
之后循环往复,记录 4 回到分区 0,依此类推。
4. 为什么选择 Kafka 而非其他消息服务?
在需要高吞吐与实时数据处理的用例中,选择 Kafka 往往取决于其独特优势。Kafka 的突出之处在于:
5. 解释 Apache Kafka 提供的所有 API。
API(应用程序编程接口)用于不同服务、微服务与系统之间的通信。Kafka 提供一套 API,用于构建事件流平台并与其消息系统交互。
Kafka 的核心 API 包括:
这些 API 使 Kafka 内的数据生产、消费、处理与管理无缝衔接。
中级 Kafka 面试题
这些问题面向已较为熟悉 Kafka 用途的从业者。
6. 增加 Kafka 主题分区数量会带来哪些影响?
增加 Kafka 主题的分区数量可通过允许更多消费者并行读取来提升并发与吞吐。但同时也会带来一些挑战:
7. 解释 Kafka 架构的四个组件
Kafka 是由多个关键组件构成的分布式架构:
代理节点(Broker nodes)
Kafka 的分布式架构由多个关键组件组成,其中之一是代理节点。代理负责繁重的 I/O 操作,并管理消息的持久化存储。它们接收来自生产者的数据、进行存储并提供给消费者读取。每个代理都是 Kafka 集群的一部分,并有唯一 ID 以便协调。
在较早版本的 Kafka 中,集群通过 Zookeeper 管理,负责代理间协调并跟踪诸如分区位置等元数据(尽管 Kafka 正在转向内部的 KRaft 模式)。Kafka 代理具有高度可扩展性,能够在分布式系统中处理海量的消息读写请求。
ZooKeeper 节点
ZooKeeper 在 Kafka 中扮演关键角色,负责管理代理注册并选举 Kafka 控制器,该控制器处理集群的管理操作。ZooKeeper 自身以集群(ensemble)的形式运行,多进程协作以确保任一时刻仅有一个代理被指派为控制器。
若当前控制器发生故障,ZooKeeper 会迅速选举新的代理接替。尽管 ZooKeeper 曾是 Kafka 架构的重要组成部分,Kafka 正在过渡至无需 ZooKeeper 的 KRaft 模式。ZooKeeper 是一个独立的开源项目,并非 Kafka 原生组件。
生产者
Kafka 生产者是作为数据源的客户端应用,通过与代理建立持久的 TCP 连接,将记录发布到一个或多个 Kafka 主题。
多个生产者可并发向同一主题发送记录。Kafka 主题是仅追加的,这意味着生产者可以写入新数据,但无论是生产者还是消费者都不能修改或删除已有记录,从而保证数据不可变性。
消费者
Kafka 消费者是订阅一个或多个 Kafka 主题来消费记录流的客户端应用。消费者通常以消费者组的形式工作,将读取与处理记录的负载分配给多个消费者。
每个消费者通过维护位移来跟踪其在流中的进度,确保不会重复处理数据且未处理的记录不会丢失。Kafka 消费者是数据管道的最后一步,记录在此被处理或转发至下游系统。
Apache Kafka 架构示意图(作者制图)
8. Kafka 中日志压缩(log compaction)的主要目的是什么?它对消费者性能有何影响?
Kafka 中日志压缩的主要目标是为主题日志中的每个唯一键保留其最新值,从而确保数据的最新状态得以保存并减少存储占用。这样一来,消费者无需处理较早的重复数据即可更高效地获取当前值。
与 Kafka 传统的基于时间的保留策略(在一定时间后删除消息)不同,日志压缩只会对每个键删除较旧记录,始终保留该键的最新值。该特性在维持消费者可获取当前状态的同时,保持更紧凑的日志,进而提升存储效率并加快查找。
9. Kafka 集群中的分区(Partitions)与副本(Replicas)有何区别?
分区与副本是 Kafka 架构的关键组成部分,兼顾性能与容错。分区通过将主题拆分为多个部分来提升吞吐,使消费者可以并行从不同分区读取,从而增强 Kafka 的可扩展性与效率。
副本则通过在多个代理间创建分区副本来提供冗余。这确保了容错:当主导代理(负责该分区读写操作的代理)发生故障时,某个跟随副本可被提升为新的主导者接管。
Kafka 为每个分区维护多个副本以确保高可用与数据持久性,最大限度降低故障期间的数据丢失风险,尽管完整的持久性仍取决于复制相关设置。
10. Kafka 中的模式(schema)是什么?它对分布式系统为何重要?
在 Kafka 中,模式定义了数据的结构与格式,例如字段 CustomerID(整数)、CustomerName(字符串)与 Designation(字符串)。
在 Kafka 这类分布式系统中,生产者与消费者必须就数据格式达成一致,才能避免交换数据时出现错误。Kafka 的 Schema Registry 负责管理并强制执行这些模式,确保生产者与消费者使用兼容版本。
Schema Registry 存储模式(常见格式包括 Avro、Protobuf 或 JSON Schema),并支持模式演进,使数据格式可在不破坏现有消费者的情况下发生变化。这样在模式演进时也能确保数据交换顺畅与系统可靠。
Schema Registry 如何与生产者/消费者协同(作者制图)
高级 Kafka 面试题
对于资深的 Kafka 用户,您可能会面对更具技术深度的面试题。
11. Kafka 如何防止消息丢失?
Kafka 通过多种机制防止消息丢失并确保可靠投递:
acks=all):在生产者端设置acks=all,可确保消息在被视为写入成功前,已获得所有同步副本的确认,从而降低代理故障导致的丢失风险。min.insync.replicas与replication.factor):Kafka 会将每个分区的数据复制到多个代理。复制因子大于 1 提供容错能力,即便某个代理宕机,数据仍可在其他代理上可用。min.insync.replicas设置确保在写入前至少有一定数量的副本确认,从而提升数据持久性。例如,复制因子为 3 时,即使一个代理宕机,数据仍保留在另外两个代理上。max.in.flight.requests.per.connection=1等谨慎配置组合使用,可降低消息乱序的概率,确保消息最终被投递且不丢失。12. Kafka 与 RabbitMQ 有何不同?
Kafka 与 RabbitMQ 是两种常见的消息系统,在架构与用法上存在差异。它们在关键方面的对比如下:
1. 用途与设计
Kafka 面向大规模数据流与实时管道,针对高吞吐与低延迟进行了优化。其基于日志的架构确保持久性并支持数据重处理,适用于事件溯源与流处理等用例。
RabbitMQ 是通用消息代理,支持复杂路由,通常用于微服务之间的消息传递或在工作者之间分发任务。它在需要可靠消息投递、灵活路由与服务间交互的环境中表现出色。
2. 架构
Kafka 将消息按主题分类,并划分为分区。每个分区可由多个消费者处理,实现并行处理与扩展。数据以可配置的保留期存储在磁盘上,既保证持久性,又可在需要时重放消息。
RabbitMQ 将消息发送到队列,由一个或多个消费者进行消费。它通过消息确认、重试与死信交换机来确保可靠投递,重点关注消息完整性与路由灵活性。
3. 性能与可扩展性
Kafka 通过增加更多代理与分区实现横向扩展,可处理每秒数百万条消息。其架构支持并行处理与高吞吐,非常适合大规模数据流场景。
RabbitMQ 也可扩展,但在应对超大规模数据量时不及 Kafka 高效。它适用于中到高吞吐场景,但并非为 Kafka 那样的极致吞吐型流应用而优化。
总结:Kafka 与 RabbitMQ 都是强大的消息工具,但适用场景不同。Kafka 适合高吞吐、实时数据流与事件溯源等需要大规模并行处理的应用。
RabbitMQ 适合可靠消息投递、微服务架构中的任务分发以及复杂消息路由。在需要服务解耦、异步处理与可靠性的场景中表现突出。
13. Kafka 如何助力微服务应用开发?
Apache Kafka 在构建微服务架构方面价值突出,得益于其实时数据处理、事件驱动通信与可靠消息传递能力。Kafka 对微服务开发的支持体现在:
1. 事件驱动架构
2. 可扩展性
3. 可靠性与容错
4. 数据集成
14. 什么是 Kafka 的 Zookeeper?它如何工作?
Apache ZooKeeper 是一个开源服务,用于在分布式系统中协调与管理配置数据、同步与组服务。在旧版本的 Kafka 中,ZooKeeper 在管理元数据、领导者选举与代理协调方面发挥关键作用。
不过,自 2.8 版起 Kafka 已开始过渡到 KRaft 模式,无需 ZooKeeper。ZooKeeper 现被视为过时组件,并将在预计于 2024 年发布的 4.0 版本中被移除。
ZooKeeper 以名为“znode”的分层节点结构存储数据,每个 znode 均可存放元数据并拥有子 znode,类似文件系统。该结构对维护 Kafka 代理、主题与分区相关的元数据至关重要。ZooKeeper 通过基于法定人数(quorum)的机制确保一致性:多数节点必须就变更达成一致,从而具备高可靠与容错性。
在旧版 Kafka 中,ZooKeeper 用于以下关键功能:
ZooKeeper 的 ZAB 协议(ZooKeeper Atomic Broadcast)在发生网络分区时也能保证节点间一致性,从而确保 Kafka 的容错能力。尽管 KRaft 成为默认模式后 Kafka 将更少依赖 ZooKeeper,但其一致性与可靠性曾对管理 Kafka 的分布式特性至关重要。
15. 如何降低 Kafka 的磁盘使用?
Kafka 提供多种有效降低磁盘使用的方法。关键策略包括:
1. 调整日志保留设置
修改日志保留策略以减少消息在磁盘上的保留时长。可通过调整
retention.ms(基于时间的保留)或retention.bytes(基于大小的保留)来限制 Kafka 在删除旧消息前存储的时间或数据量。2. 实施日志压缩
使用日志压缩仅保留每个唯一键的最新消息,移除过时或冗余数据。若只需最新状态,这一方式尤为有效,在不丢失关键信息的情况下显著降低磁盘占用。
3. 配置清理策略
根据用例设置合适的清理策略。可同时配置基于时间(
retention.ms)与基于大小(retention.bytes)的保留策略,以自动删除旧消息并控制磁盘占用。4. 启用消息压缩
在生产者端启用消息压缩,例如使用 GZIP、Snappy 或 LZ4。压缩可减小消息尺寸,从而降低磁盘占用。但需权衡压缩/解压带来的 CPU 开销。
5. 调整日志段大小
通过配置 日志段大小(
segment.bytes)来控制滚动日志段的频率。较小的段大小可更频繁地滚动,有助于更高效地释放旧数据以节省磁盘空间。6. 删除不必要的主题或分区
定期检查并删除未使用或不必要的主题与分区。这将释放磁盘空间并帮助控制 Kafka 的磁盘占用。
面向数据工程师的 Kafka 面试题
如果您正在应聘数据工程师岗位,建议重点准备以下 Kafka 面试问题。
16. Kafka 中的领导者副本与跟随者副本有何区别?
领导者副本
领导者副本处理所有客户端的读写请求。它管理分区状态,是生产者与消费者交互的主要入口。若领导者发生故障,其角色会转移给某个跟随者副本以维持可用性。
跟随者副本
跟随者副本从领导者进行数据复制,但不直接处理客户端请求。其职责是通过保持分区数据的最新副本来确保容错。从 Kafka 2.4 起,在特定条件下,跟随者副本也可处理读请求,以分摊负载并提升读取吞吐。若领导者故障,将从跟随者中选举新的领导者,以维持数据一致性与可用性。
17. 为什么在 Kafka 中要使用集群?有哪些好处?
Kafka 集群由多个代理组成,将数据分布至多个实例,从而在不停机的情况下实现可扩展性。这些集群旨在将延迟降至最低,若主集群故障,其他 Kafka 集群可接管以维持服务连续性。
Kafka 集群的架构包括主题、代理、生产者与消费者。它高效管理数据流,非常适合大数据应用与数据驱动型应用的开发。
18. Kafka 如何保证消息有序?
Kafka 主要通过两种方式保证消息有序:
19. 在 Kafka 中,ISR 与 AR 分别代表什么?什么是 ISR 扩容?
ISR(in-sync replicas,同步副本)
ISR 指与领导者副本完全同步的副本。这些副本拥有最新数据,被视为可可靠用于读写操作。
AR(assigned replicas,已分配副本)
AR 包含分配给某分区的所有副本,既包括同步副本也包括不同步副本。它表示该分区的完整副本集合。
ISR 扩容
当新的副本追上领导者并被加入 ISR 列表时,即发生 ISR 扩容。这会增加最新副本的数量,提升容错与可靠性。
20. Kafka 中的零拷贝(zero-copy)使用场景是什么?
Kafka 使用零拷贝高效地在生产者与消费者之间传输海量数据。它利用
FileChannel.transferTo方法将数据直接从文件系统传输至网络套接字,无需额外拷贝,从而提升性能与吞吐。该技术还利用内存映射文件(mmap)读取索引文件,使用户态与内核态共享数据缓冲,进一步减少额外拷贝。这使 Kafka 非常适合高效处理大规模实时数据流。
备战您的 Kafka 面试
在准备以 Kafka 为重点的数据工程面试时,既要夯实技术基础,也要清楚了解 Kafka 如何融入现代系统。Kafka 是许多实时数据平台的核心,面试官会期望您既掌握基础知识,也了解其在可扩展、具容错环境中的工作方式。
重点关注领域
结合本文覆盖的 Kafka 面试题,您需要重点复习以下领域:
面试小贴士
以下建议可助您在面试中脱颖而出:
通过打磨这些能力并充分准备,您将更从容地应对与 Kafka 相关的面试。请记住,面试官不仅看重技术专长,也重视清晰表达与解决实际问题的能力。全程展现您对数据工程的热情。