跳至主要内容

面向数据工程师的 20 道 Kafka 面试题

通过我们详尽的 Kafka 面试题与答案清单,为您的下一次数据工程面试做好准备。
Ashish Sharma
Ashish Sharma

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

理解数据如何流动并充分发挥其潜力,已成为现代组织的关键能力。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 Messaging Distributed system

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 消费者是数据管道的最后一步,记录在此被处理或转发至下游系统。

Architecture diagram of Apache 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),并支持模式演进,使数据格式可在不破坏现有消费者的情况下发生变化。这样在模式演进时也能确保数据交换顺畅与系统可靠。

How Schema registry works with producer/consumer

Schema Registry 如何与生产者/消费者协同(作者制图)

高级 Kafka 面试题

对于资深的 Kafka 用户,您可能会面对更具技术深度的面试题。 

11. Kafka 如何防止消息丢失?

Kafka 通过多种机制防止消息丢失并确保可靠投递:

  1. 手动提交位移:消费者可关闭自动提交位移,并在成功处理消息后手动提交,以避免在消费者崩溃时丢失未处理的消息。
  2. 生产者确认(acks=all):在生产者端设置 acks=all,可确保消息在被视为写入成功前,已获得所有同步副本的确认,从而降低代理故障导致的丢失风险。
  3. 复制(min.insync.replicas 与 replication.factor):Kafka 会将每个分区的数据复制到多个代理。复制因子大于 1 提供容错能力,即便某个代理宕机,数据仍可在其他代理上可用。min.insync.replicas 设置确保在写入前至少有一定数量的副本确认,从而提升数据持久性。例如,复制因子为 3 时,即使一个代理宕机,数据仍保留在另外两个代理上。
  4. 生产者重试:将重试次数配置为较高值,确保在瞬时故障时生产者会重试发送。与 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 用于以下关键功能:

  1. 领导者选举:ZooKeeper 选举控制器节点,负责分区领导者分配与其他集群级任务。
  2. 代理元数据管理:维护活动代理及其状态的集中式注册表。
  3. 分区重分配:在故障或集群扩容期间,协助管理跨代理的分区再均衡。

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 主要通过两种方式保证消息有序:

  1. 使用消息键:当消息被指定键时,具有相同键的所有消息都会被发送至同一分区。由于 Kafka 保证分区内的顺序,这能确保相同键的消息按接收顺序被处理。
  2. 单线程的消费者处理:为保持顺序,消费者应以单线程处理来自某一分区的消息。若使用多线程,可为每个分区建立独立的内存队列,确保并发处理时仍按正确顺序消费。

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 的最新特性与最佳实践。阅读文档或参与开源贡献能体现您对持续学习的投入。

面试小贴士

以下建议可助您在面试中脱颖而出: 

通过打磨这些能力并充分准备,您将更从容地应对与 Kafka 相关的面试。请记住,面试官不仅看重技术专长,也重视清晰表达与解决实际问题的能力。全程展现您对数据工程的热情。

Ashish Sharma

作者

Ashish Sharma

Ashish 拥有 12 年的专业经验,是一名在微软技术栈方面有着卓越实绩的解决方案架构师。他成功带领团队执行了与数据治理、数据分析、报告与洞察,以及可视化相关的项目。

主题