Kafka 面试:Kafka 发送消息是如何保证可靠性的?

你曾被提过类似的问题在面试中问过吗?或者将来会遇到,让我们一起探索和掌握它!

感谢您阅读这篇文章。更多面试问题:
https://programmerscareer.com/zh-cn/software-interview-set/

主题: 1.1 如何理解 Kafka 工作原理?

Apache Kafka 是 LinkedIn 开源并后来捐赠给 Apache Software Foundation 的实时数据处理软件平台。其目标是为处理实时数据流提供一个统一、高吞吐量、低延迟的平台。它使用 Scala 和 Java 编写。

Kafka 生态系统包括生产者、消费者、主题、Brokers 和 ZooKeeper:

生产者:生产者是将原始消息推送到 Kafka Brokers 的组件。生产者可以将消息发送到特定主题或者让 Kafka 进行路由和负载平衡。

Brokers:Kafka Brokers 是系统的核心部分;它们接收生产者发来的消息,分配偏移量并提交消息到磁盘上的存储。

消费者:消费者从Brokers读取。然而,与传统的消息系统不同,消费者从Brokers拉取消息。

主题和分区:主题是特定类别的消息流。Kafka 主题分割成多个分区,其中包含记录的顺序不可更改的列表。分区允许并行化主题,并将数据分割到多个节点上。

ZooKeeper:ZooKeeper 管理和协调 Kafka 集群。ZooKeeper 服务用于维护名称和配置数据,并提供灵活和可靠的同步功能。

Kafka 的工作原理类似于传递系统。例如,想象一下邮递员(生产者)向特定邮件盒(主题)投递信件(消息)。邮件局(Kafka)排序和维护这些信件,最后,居民(消费者)从邮件盒中提取他们的邮件。

主题: 1.2 Kafka 生产者

Kafka 生产者是负责向 Kafka 主题发布数据(称为记录)的组件。生产者是为了向 Kafka Brokers提供数据的关键组件。

下面是 Kafka 生产者的工作原理:

创建生产者:生产者使用特定的属性创建,例如Brokers的地址、键序列化器和值序列化器。Brokers使用这些属性来识别正确的主题并了解如何解析消息。

写数据:创建生产者后,它可以开始发送记录到指定主题。Kafka 记录包含一个键和一个值。这些是字节数组。键是可选的,用于确定特定分区的主题,其中消息将被写入。如果键不存在,Kafka 使用轮询方法写入分区。

分区:生产者发布数据到不同的分区,可以采用轮询方法或者语义上的有意义方法。当键为 null 时,数据将按轮询方式写入分区。如果键存在,所有具有该键的消息都将写入同一分区(如果分区数量不变)。

序列化:Kafka 消息是字节数组。因此,无论数据格式如何,您必须将其转换为字节,以发送到 Kafka。我们称这个过程为序列化。因此,每次发送记录时,生产者必须将对象转换为字节。

确认和重试:在分布式系统中,机器会失败。Kafka 提供了确认和重试的机制。Kafka 可以设置为在写入领导者(ack=1)、所有追随者(ack=all)或者不确认(ack=0)时进行确认。

从生产者配置中可以看出,我们可以通过调整可靠性和持久性保证来利用有效地事件驱动的系统的深入理解。

主题: 1.3 可靠消息传递 — 基本原理

可靠消息传递是任何消息中间件的关键部分。 Kafka 提供了强大的持久性保证和容错性来确保可靠消息传递。

可靠消息传递的基本原理在 Kafka 中主要围绕以下主要概念:

生产者和消息确认:我们已经了解过,生产者向 Kafka Brokers发送消息。这些消息可以以不同的方式进行确认,控制生产者的 acks 属性。该确认级别影响消息的持久性。一个 ack 的值为 ‘1’ 表示已成功写入主题的领导者日志。一个 ack 的值为 ‘all’ 表示已成功写入所有同步复制的日志。

复制和同步复制:复制是确保消息持久性的关键特性。每个 Kafka 分区都有多个复制,其中一个被选为领导者。所有的写入和读取都通过领导者进行。其他是追随者,其主要任务是复制领导者。只有在所有的同步复制中写入消息时,消息才被认为已提交并成功写入。

消费者偏移量和传递语义:消费者从 Kafka 主题中读取消息并在其偏移量上进行跟踪,以存储消息的偏移量。Kafka 提供三种传递语义:至多一次、至少一次和精确一次。通过正确地存储和管理偏移量,Kafka 确保消息至少被传递一次。

提交和未提交的消息:在 Kafka 中,消息被认为已提交,当它们成功地写入所有同步复制的日志时。消息可以写入日志,但是消费者不能消费它们,直到它们被提交,保护数据一致性和部分数据在故障发生时。

中文翻译:

主题: 1.4 Kafka Brokers和主题复制

Kafka Brokers是系统的核心部分,处理生产者发送的消息,分配偏移量并将消息持久化到磁盘上。现在,让我们深入了解。

Kafka 集群由多个Brokers组成。每个Brokers可以处理来自多个客户端的数据和请求,因为主题分区并分布在多个Brokers实例上。

主题复制: Kafka 的复制是可靠性和容错性的关键特性。每个主题可以有多个复制,允许在多个Brokers上存储。这意味着即使Brokers出现故障,主题数据仍然可以从其他Brokers处获取。

复制的主题分区被分布到集群中的多个Brokers上。具有复制的主题提供了 Kafka 的容错性。

Leader 和 Follower: 对于分区,一个复制会成为 Leader,其他的会成为 Follower。领导者处理分区的读取和写入请求,而追随者以被动的方式复制领导者。如果领导者出现故障,其中一个追随者将自动成为新的领导者。

同步复制(ISR): 如果追随者超出领导者的范围(配置可变),领导者将从 ISR(同步复制)列表中删除追随者。只有 ISR 列表中的成员才能被选为领导者。

复制和可靠性: Brokers在主题复制的角色和功能是关键的,为 Kafka 提供的数据传递语义。读取和写入Brokers确保记录的持久性,并且Brokers的故障不会影响数据的完整性。

主题: 1.5 Kafka 消费者的进入和出口

Kafka 消费者是读取和处理数据的应用程序。消费者的角色和功能是关键的,为 Kafka 提供了可靠性和容错性。

下面是 Kafka 消费者的一些关键方面:

消费者组: 多个消费者可以组成一个“消费者组”。作为组的一部分,他们共享消费负载,每个消费者读取主题的分区。这为 Kafka 提供了负载平衡和容错性的特性。

消费消息: 消费者读取主题并处理它们。他们维护下一条消息的偏移量。

偏移量和消费者位置: 每个消费者组维护其偏移量或位置——记录哪些消息已被消费。如果消费者成功处理了一条消息,则偏移量将进一步。因此,即使消费者崩溃,它也可以从其离开的地方继续,增加了系统的容错性和坚持性。

重平衡: 当消费者停止或新消费者加入 Kafka 消费者组时,重平衡协议被初始化。该协议确保消费者优雅地离开,而新消费者加入平滑地,不会影响消费者组内的消息消费过程。

传递语义: 根据消费者如何管理偏移量和提交,Kafka 提供三种传递语义——至多一次、至少一次和精确一次。正确地设计消费者应用程序是关键的,以确保它们能够正确地处理这些语义。

在 Kafka 数据流中,消费者起着重要的角色,驱动实时处理系统。深入了解 Kafka 消费者是关键的,以利用 Kafka 的全部潜力来构建健壮和可扩展的数据处理系统。

主题: 1.6 Kafka 如何可靠传递消息

Kafka 的主要责任是可靠地传递生产者(写数据)发送的记录到消费者(读数据)。下面是 Kafka 如何确保可靠消息传递的细节:

复制和冗余性: Kafka 通过主题复制功能确保消息持久性。Kafka 主题被分割成分区,并且每个分区可以在多个节点上复制,称为伺服器。这意味着同一条消息可以存在多个地方,提供了高级冗余性。

Leader 和 Follower: 对于每个 Kafka 分区,伺服器可以在两种角色中选择:领导者和追随者。所有的读取和写入都由领导者处理,而追随者以被动的方式复制领导者。如果领导者出现故障,则追随者可以替代并为消费者提供业务持续性。

确认(ACKs): ACKs 起着重要的作用。当生产者发送消息时,它可以选择在写入领导者的日志中收到确认(acks=1),或者在写入所有同步复制中收到确认(acks=all)。这种选择会贡献到性能和坚持性的权衡。

同步复制(ISRs): Kafka 强制要求只有处于同步状态的复制才能被选为领导者。ISR 是一个复制,它已经完全抓住了分区领导者,并且没有超过指定时间内领导者日志的延迟。确保领导者总是来自 ISR 给 Kafka 提供了强一致性,因为它保证了写入到领导者并确认的消息不会丢失,只要故障数量在复制因子内。

消费者偏移量: Kafka 消费者维护其偏移量(读取位置)。即使消费者出现故障,它也可以从它保存的偏移量中恢复读取消息,从而最小化数据丢失。

总结一下,Kafka 确保可靠地传递消息通过分割数据并复制到多个节点以提供冗余性,确认,维护 ISR 列表以提供一致性,并利用偏移量进行有效的消费。

主题:1.7 Kafka 可靠性最佳实践

Kafka 集群的可靠性主要取决于管理和相关的传递实践。下面是 Kafka 的可靠性最佳实践:

监控你的集群:保持关注你的 Kafka 集群。这包括追踪各种指标,例如未提交的消息数量、进入和从每个节点传出的数据率、主题和分区数量,以及未复制的分区数量。监控可帮助您识别潜在的问题并在严重程度上进行预防。

合理的保留期:请记,增加保留期会增加存储和堆使用量。根据需要进行平衡,以避免资源限制。

合理的分区数量:在选择分区数量时,请谨慎考虑。虽然更多的分区允许更好的并行性,但它也意味着更多的打开的服务器连接和更高的 ZooKeeper 负载。

合理的复制因子:高复制因子提高了冗余性和可靠性,但它也会增加存储要求。根据所需的冗余程度进行配置。

合理的确认策略:根据应用程序要求使用正确的确认策略(‘acks’)。对于关键数据,请考虑使用 ‘acks=all’,以确保数据在所有同步复制中都被确认。

**有效的 In-Sync Replicas (ISRs)**:配置 ISR 设置以确保您有正确的平衡,以便保持适当的延迟和持久性保证。请确保 min.insync.replicas 根据需要进行设置,以避免在故障期间丢失数据。

消费者偏移管理:请确保消费者定期提交其偏移量。这可帮助避免在故障期间重新广播大量数据。但请勿提交过于频繁,因为每次提交都是对 ZooKeeper 的调用。

总之,在 Kafka 中实现可靠的传递需要一个平衡,其中包括操作要求、资源使用和应用程序特定要求。

主题:1.8 Kafka 的消息传递语义

在 Kafka 中,消息传递语义决定了生产者如何将消息传递给消费者。Kafka 提供三种消息传递语义:

1. At Most Once:在这种情况下,消息被传递至多一次给消费者。这意味着消息可能会丢失,但它们不会被重新传递或重复。这是最快的,因为它涉及最少的生产者和 Kafka 之间的协调。然而,它不是最可靠的方法,因为任何在 Kafka 发送消息和消费者读取它之间的故障都会导致消息的丢失。

2. At Least Once:消息被传递至少一次给消费者。但是,在某些情况下,消息可能会重复,这可能会导致问题。这种方法更可靠,因为它确保消息不会丢失。然而,它有重复消息的风险,因为可能会重新传递。对于幂等处理,这可能是完全可以的。

3. Exactly Once:这确保每个消息被传递恰好一次——无损失,无重复。然而,它是最慢和最资源密集的选择,因为需要事务来跟踪进度。这通常用于关键系统,其中消息的丢失或重复可能会导致重大问题。

这些传递语义决定了你的 Kafka 基于应用程序的系统的坚持和可靠性。选择速度、一致性和可靠性取决于应用程序的使用情况。

主题:1.9 回顾和评估

我们已经详细介绍了 Kafka 课程的许多方面,让我们来做一个简短的回顾:

  1. Kafka 是如何工作的:我们学习了各种 Kafka 组件如何相互作用以提供一个可靠、可伸缩和容错的消息系统。
  2. Kafka 生产者:我们深入探讨了 Kafka 生产者如何发送消息并了解了其关键配置。
  3. 可靠消息传递的基本概念:我们了解了确保消息持久性和可靠性在 Kafka 中的基本概念。
  4. Kafka 节点和主题复制:我们深入探讨了 Kafka 节点的工作原理并了解了主题复制如何增加可靠性。
  5. Kafka 消费者:我们探索了 Kafka 消费者和消费者组的复杂性并确定了其角色在保持可靠性方面的重要性。
  6. Kafka 如何可靠地发送消息:我们剖析了 Kafka 内部机制,用于确保可靠的消息传递。
  7. Kafka 的可靠消息传递最佳实践:我们讨论了优化 Kafka 的消息传递以增加可靠性的具体方法。
  8. Kafka 的消息传递语义:最后,我们看了三种类型的传递语义,它们的重要性和使用场景。

现在,是时候评估你的了解和应用了。我们可以进行一些练习问题和分析真实世界中广泛使用的 Kafka 场景,以帮助固定你所学的知识并帮助你更好地将 Kafka 集成到你的系统中。

例题:列出并解释 Kafka 中的三种不同的传递语义?

解决方案

  1. At Most Once:在这种情况下,消息被传递至多一次,这意味着消息可能会丢失,但它们不会被重新传递或重复。这是最快的,但是,它不是最可靠的方法,因为任何在 Kafka 发送消息和消费者读取它之间的故障都会导致消息的丢失。
  2. At Least Once:消息被传递至少一次,这意味着消息是确保传递的,但是,在某些情况下,消息可能会重复,这可能会导致问题。这种方法更可靠,但是,重复可能会成为问题。
  3. Exactly Once:在这种情况下,消息被传递恰好一次——无损失,无重复。然而,它是最慢和最资源密集的选择,因为需要事务来跟踪进度。这通常用于关键系统,其中消息的丢失或重复可能会导致重大问题。

问题1

Kafka 集群中 Kafka 生产者的角色是什么?

问题2

请解释 Kafka 中主题复制的概念。为什么它是重要的?

问题3

请介绍 Kafka 中的 In-Sync Replicas (ISRs)。

问题4

请提供可靠消息传递在 Kafka 中的一些最佳实践。

问题5

请说明 Kafka 是如何保证可靠消息传递的?

答案1

Kafka 集群中的 Kafka 生产者的角色是发布数据或消息到一个或多个 Kafka 主题。生产者发送的消息会被追加到提交日志的末尾并分配一个唯一的偏移号码。

答案2

Kafka 主题复制是 Kafka 中的一个特性,用于确保集群中的消息在某些 Kafka 节点(由于故或维护而不可用)不可用时仍然可用。每个主题可以在配置的节点数量上复制。这有助于确保没有消息丢失并提供高数据可用性。

答案3

In-Sync Replicas (ISRs) 是与领导者同步的复制集。任何超过某个配置时间未向领导者发送获取请求的复制集成 ISR 集合。如果复制集未能从领导者获取,它将从 ISR 集合中删除并不会被认为是为客户端生产数据的候选者。

答案 4

在 Kafka 中可靠消息传递的一些最佳实践包括根据使用场景选择正确的消息传递语义,遵循最小权限原则进行权限管理,为长期主题使用压缩,监控并设置警报关键指标,保持 Kafka 集群和客户端库的更新,等等。

答案 5

Kafka 保证可靠消息传递通过多种机制来实现,例如复制、In-Sync Replicas (ISRs)、确认和配置可靠性语义。生产者会等待来自全部 In-Sync Replicas 的确认,直到消息被写入。如果消息写入失败,生产者会自动重试。消费者会维护一个偏移量来跟进每个主题的进度。

English post: https://programmerscareer.com/kafka-interview1/
作者:Wesley Wei – Twitter Wesley Wei – Medium
注意:本文为作者原创,转载请注明出处。

use-channel MySQL面试:简要介绍MySQL的主从同步机制

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×