Apache Kafka元素解析

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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体系中的基本元素的简要解析,只有将基础的概念梳理清楚,才能在后续的架构实践中容易上手,以便能够解决项目中的问题。

相关文章
|
2天前
|
消息中间件 Java Kafka
Spring Boot与Apache Kafka的深度集成
Spring Boot与Apache Kafka的深度集成
|
1天前
|
消息中间件 Kafka 程序员
Kafka面试必备:深度解析Replica副本的作用与机制
**Kafka的Replica副本是保证数据可靠性的关键机制。每个Partition有Leader和Follower副本,Leader处理读写请求及管理同步,Follower被动同步并准备成为新Leader。从Kafka 2.4开始,Follower在完全同步时也可提供读服务,提升性能。数据一致性通过高水位机制和Leader Epoch机制保证,后者更精确地判断和恢复数据一致性,增强系统容错能力。**
7 1
|
2天前
|
消息中间件 监控 Kafka
深入解析:Kafka 为何不支持全面读写分离?
**Kafka 2.4 引入了有限的读写分离,允许Follower处理只读请求,以缓解Leader压力。但这不适用于所有场景,特别是实时数据流和日志分析,因高一致性需求及PULL同步方式导致的复制延迟,可能影响数据实时性和一致性。在设计系统时需考虑具体业务需求。**
6 1
|
8天前
|
消息中间件 存储 缓存
高性能、高可靠性!Kafka的技术优势与应用场景全解析
**Kafka** 是一款高吞吐、高性能的消息系统,擅长日志收集、消息传递和用户活动跟踪。其优点包括:零拷贝技术提高传输效率,顺序读写优化磁盘性能,持久化保障数据安全,分布式架构支持扩展,以及客户端状态维护确保可靠性。在实际应用中,Kafka常用于日志聚合、解耦生产者与消费者,以及实时用户行为分析。
18 3
|
3天前
|
消息中间件 Java Kafka
Spring Boot与Apache Kafka集成的深度指南
Spring Boot与Apache Kafka集成的深度指南
|
4天前
|
消息中间件 SQL 存储
ClickHouse(21)ClickHouse集成Kafka表引擎详细解析
ClickHouse的Kafka表引擎允许直接从Apache Kafka流中消费数据,支持多种数据格式如JSONEachRow。创建Kafka表时需指定参数如brokers、topics、group和format。关键参数包括`kafka_broker_list`、`kafka_topic_list`、`kafka_group_name`和`kafka_format`。Kafka特性包括发布/订阅、容错存储和流处理。通过设置`kafka_num_consumers`可以调整并行消费者数量。Kafka引擎还支持Kerberos认证。虚拟列如`_topic`、`_offset`等提供元数据信息。
13 0
|
4天前
|
消息中间件 存储 运维
RocketMQ与Kafka深度对比:特性与适用场景解析
RocketMQ与Kafka深度对比:特性与适用场景解析
|
5天前
|
消息中间件 存储 大数据
深度分析:Apache Kafka及其在大数据处理中的应用
Apache Kafka是高吞吐、低延迟的分布式流处理平台,常用于实时数据流、日志收集和事件驱动架构。与RabbitMQ(吞吐量有限)、Pulsar(多租户支持但生态系统小)和Amazon Kinesis(托管服务,成本高)对比,Kafka在高吞吐和持久化上有优势。适用场景包括实时处理、数据集成、日志收集和消息传递。选型需考虑吞吐延迟、持久化、协议支持等因素,使用时注意资源配置、数据管理、监控及安全性。
|
9天前
|
机器学习/深度学习 缓存 算法
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
|
11天前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
23 3

推荐镜像

更多