Apache Kafka元素解析

简介: Apache Kafka 是什么?干什么用的?本文试图从基本元素等微观角度去剖析Apache Kafka的原理机制。作为一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域,由 LinkedIn 开发,基于Scala 编写,Apache Kafka以可水平扩展和高吞吐率而被广泛使应用于各行各业,是大型分布式系统不可缺少的中间件产品。

      Apache Kafka 是什么?干什么用的?本文试图从基本元素等微观角度去剖析Apache Kafka的原理机制。作为一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域,由 LinkedIn 开发,基于Scala 编写,Apache Kafka以可水平扩展和高吞吐率而被广泛使应用于各行各业,是大型分布式系统不可缺少的中间件产品。

       Apache Kafka的基本元素是什么?

      要了解Apache Kafka的工作方式,我们需要熟悉Kafka生态系统的基本要素。首先,我们先了解一下其基本架构,如下图所示:

       从上述体系中,我们可以看到,整个架构主要包含:Producer(消息生产者)、Consumer(消息消费者)、Broker(代理)、Zookeeper(分布式协调框架及注册中心)等基础组件,以及它们之间进行交互的Topic(订阅主题)等等,其整个工作流围绕上述组件进行运作。

      在实际的业务场景中,如何能够降低复杂性并简化服务之间的集成呢?要回答此问题,首先,我们应该先了解一下事件的概念。 什么是事件呢?

      在Apache Kafka生态中,事件,是一个具有键,值,时间戳和可选的元数据标题。密钥不仅用于标识,而且还用于具有相同密钥的事件的路由和聚合操作。

      由上图所知:事件生产者和消费者之间的交互由事件驱动。这种模式支持服务之间的松散耦合,对于我们来说更重要的是,事件产生者不需要知道事件使用者状态。这是模式的本质。从生产者的角度来看,我们不需要知道谁或如何使用主题数据。

      当然,像往常一样,一切都是相对的。并非事件驱动的样式始终是最好的。这取决于用例。例如,当操作应该同步完成时,自然会使用请求-响应样式。在诸如用户身份验证,报告AB测试或与第三方服务集成的情况下,最好使用异步样式。当需要松散耦合时,最好采用事件驱动的方法。在较大的系统中,我们正在混合样式以实现业务目标。

      在业务场景使用过程中,如果消息未附加密钥,则使用循环算法发送数据。当事件附加了键时,情况就不同了。然后,事件总是转到拥有此键的分区。从性能角度来看,这是有意义的。我们通常使用id来获取有关对象的信息,在这种情况下,从同一代理获取信息要比在许多代理中寻找信息更快。具体可参考如下:

      目前,Apache Kafka有以下几种不同类型的事件:

      1、非密钥事件:无需使用密钥的事件。它描述了系统中发生的单个事实。它可以用于度量目的。

      2、实体事件:最重要的事件。它描述了给定时间点上业务对象的状态。它必须具有唯一键,该键通常与业务对象的ID有关。它们在事件驱动的体系结构中扮演着主要角色。

      3、键事件:具有键但与任何业务实体都不相关的事件。该密钥用于聚合和分区。

回到Apache Kafka的基本架构图,

     基于文章首页的架构图,我们对核心元素进行一一分析:

     Topic:事件存储。类似于文件系统中的文件夹,该主题类似于组织内部内容的文件夹。可以将订单保留在电子商务系统中的所有订单事件的主题示例名称中。与其他消息传递系统不同,事件在阅读后仍保留在主题上。它使其功能非常强大且具有容错能力。当消费者将处理带有错误的东西并想再次对其进行处理时,这也解决了一个问题。主题始终可以有零个,一个或多个生产者和订阅者。

      Kafka 中消息是以 Topic 进行分类的,生产者生产消息,消费者消费消息,面向的都是同一个 Topic。

      Topic 是逻辑上的概念,而 Partition 是物理上的概念,每个 Partition 对应于一个 log 文件,该 log 文件中存储的就是 Producer 生产的数据。每一个Topic被划分为多个较小部分,称之为“分区” 。分区可以描述为提交日志。消息可以附加到日志中,并且可以按从头到尾的顺序为只读。分区旨在提供冗余和可伸缩性。最重要的事实是分区可以托管在不同的服务器(代理)上,这提供了一种非常强大的方法来水平扩展主题。

      Producer 生产的数据会不断追加到该 log 文件末端,且每条数据都有自己的 Offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个 Offset,以便出错恢复时,从上次的位置继续消费。

     由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据定位效率低下,Kafka 采取了分片和索引机制。它将每个 Partition 分为多个 Segment,每个 Segment 对应两个文件:“.index” 索引文件和 “.log” 数据文件。这些文件位于同一文件下,该文件夹的命名规则为:topic 名-分区号。例如,first 这个 topic 有三分分区,则其对应的文件夹为 first-0,first-1,first-2。

      Producer:生产者。负责创建有关Kafka Topic的新事件的客户端应用程序。生产者负责选择主题分区。如前所述,默认情况下,当我们不提供任何密钥时,将使用轮询。还有一种创建自定义业务映射规则以将分区分配给消息的方法。

      Consumer:消费者。负责从Kafka中读取和处理事件的客户端应用程序。消费者按事件的产生顺序读取所有事件。每个消费者还可以订阅多个主题。分区上的每个消息都有一个由Apache Kafka生成的唯一整数标识符(偏移量),当新消息到达时该标识符会增加。消费者使用它来知道从哪里开始阅读新消息。综上所述,分区和偏移量用于在Apache Kafka系统中精确定位消息。管理补偿是每个消费者的主要责任。

     消费者的概念很容易。但是缩放呢?如果我们有许多消费者,但只想阅读一次该怎么办?这就是设计消费群概念的原因。这里的想法是,当使用者属于同一组时,它将分配一些分区子集来读取消息。这有助于避免重复读取的情况。在下图中,有一个示例说明如何从该主题扩展数据消耗。当使用者进行耗时的操作时,我们可以将其他使用者连接到该组,这有助于更快地处理该使用者级别上的所有新事件。但是,当分区数量太少时,我们必须小心。我们将无法扩大规模。这意味着如果我们有更多的使用者而不是分区,那么它们就是空闲的。

      Broker:代理。负责在磁盘上接收和存储产生的事件,使使用者可以按主题,分区和偏移量获取消息。经纪人通常位于许多地方,并聚集在一起。

     像其他分布式系统中一样,当我们使用代理时,我们需要进行一些协调。代理可以在不同的服务器上运行(也可以在单个服务器上运行许多代理)。它提供了额外的复杂性。每个代理都包含有关其拥有的分区的信息。为了安全起见,Apache Kafka引入了专用的分区复制,以防发生故障或维护。可以为每个主题分别设置有关一个主题需要多少个副本的信息。它提供了很大的灵活性。在下图中,显示了复制的基本配置。复制基于领导者跟踪方法。

      以上为Apache Kafka体系中的基本元素的简要解析,只有将基础的概念梳理清楚,才能在后续的架构实践中容易上手,以便能够解决项目中的问题。

相关文章
|
8月前
|
消息中间件 监控 Java
Apache Kafka 分布式流处理平台技术详解与实践指南
本文档全面介绍 Apache Kafka 分布式流处理平台的核心概念、架构设计和实践应用。作为高吞吐量、低延迟的分布式消息系统,Kafka 已成为现代数据管道和流处理应用的事实标准。本文将深入探讨其生产者-消费者模型、主题分区机制、副本复制、流处理API等核心机制,帮助开发者构建可靠、可扩展的实时数据流处理系统。
753 4
|
机器学习/深度学习 存储 算法
【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)
这篇文章详细解析了力扣热题 347——前 K 个高频元素的三种解法:哈希表+小顶堆、哈希表+快速排序和哈希表+桶排序。每种方法都附有清晰的思路讲解和 Go 语言代码实现。小顶堆方法时间复杂度为 O(n log k),适合处理大规模数据;快速排序方法时间复杂度为 O(n log n),适用于数据量较小的场景;桶排序方法在特定条件下能达到线性时间复杂度 O(n)。文章通过对比分析,帮助读者根据实际需求选择最优解法,并提供了完整的代码示例,是一篇非常实用的算法学习资料。
761 90
|
存储 SQL 缓存
Apache Doris & SelectDB 技术能力全面解析
本文将对 Doris & SelectDB 适合的分析场景和技术能力进行概述解析
1950 1
Apache Doris & SelectDB 技术能力全面解析
|
10月前
|
消息中间件 存储 监控
Apache Kafka 3.0与KRaft模式的革新解读
在该架构中,Kafka集群依旧包含多个broker节点,但已不再依赖ZooKeeper集群。被选中的Kafka集群Controller将从KRaft Quorum中加载其状态,并在必要时通知其他Broker节点关于元数据的变更。这种设计支持更多分区与快速Controller切换,并有效避免了因数据不一致导致的问题。
|
数据采集 Web App开发 JavaScript
DOMParser解析TikTok页面中的图片元素
DOMParser解析TikTok页面中的图片元素
|
消息中间件 Java Kafka
什么是Apache Kafka?如何将其与Spring Boot集成?
什么是Apache Kafka?如何将其与Spring Boot集成?
815 5
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
763 1
|
消息中间件 Ubuntu Java
Ubuntu系统上安装Apache Kafka
Ubuntu系统上安装Apache Kafka
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1303 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
531 4

热门文章

最新文章

推荐镜像

更多