深度剖析消息中间件Kafka核心组件

举报
tea_year 发表于 2025/04/28 15:40:07 2025/04/28
【摘要】 Apache Kafka 是一个分布式发布-订阅消息系统。是大数据领域消息队列中唯一的王者。最初由 linkedin 公司使用 scala 语言开发,在2010年贡献给了Apache基金会并成为顶级开源项目。至今已有十余年,仍然是大数据领域不可或缺的并且是越来越重要的一个组件。Kafka 适合离线和在线消息,消息保留在磁盘上,并在集群内复制以防止数据丢失。kafka构建在zookeeper同...

Apache Kafka 是一个分布式发布-订阅消息系统。是大数据领域消息队列中唯一的王者。最初由 linkedin 公司使用 scala 语言开发,在2010年贡献给了Apache基金会并成为顶级开源项目。至今已有十余年,仍然是大数据领域不可或缺的并且是越来越重要的一个组件。

Kafka 适合离线和在线消息,消息保留在磁盘上,并在集群内复制以防止数据丢失。kafka构建在zookeeper同步服务之上。它与 Flink 和 Spark 有非常好的集成,应用于实时流式数据分析。

Kafka特点:

可靠性:具有副本及容错机制。
可扩展性:kafka无需停机即可扩展节点及节点上线。
持久性:数据存储到磁盘上,持久性保存。 
性能:kafka具有高吞吐量。达到TB级的数据,也有非常稳定的性能。
速度快:顺序写入和零拷贝技术使得kafka延迟控制在毫秒级。

 Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流式应用程序。它由几个核心组件组成,这些组件共同工作以提供高吞吐量、持久性、容错性和可扩展性。

以下是 Kafka 的主要核心组件:

  1. Broker:Kafka 集群中的每个服务器都称为 Broker。Broker 负责维护数据主题(Topic)的分区(Partition),并处理生产者(Producer)的数据发布和消费者(Consumer)的数据拉取。
  2. Topic:主题是 Kafka 分布式系统中的消息类别。生产者将消息发送到特定的主题,而消费者从一个或多个主题读取消息。
  3. Partition:Partition 是主题的子集,是日志数据的片段。每个主题可以被分割成多个分区,分区允许消息在多个 Broker 之间进行分布,以实现负载均衡和并行处理。
  4. Producer:生产者是向 Kafka 集群发送消息的客户端。生产者负责将数据写入选定的主题和分区。
  5. Consumer:消费者是读取 Kafka 集群中消息的客户端。消费者通常属于一个消费者组(Consumer Group),可以订阅一个或多个主题,并从主题的分区中读取数据。
  6. Consumer Group:消费者组是 Kafka 中的一个核心概念,它允许多个消费者客户端组成一个组,共同处理数据。消费者组内的每个消费者可以独立地从不同的分区读取数据,以实现负载均衡。
  7. ZooKeeper:Kafka 使用 ZooKeeper 来管理集群的元数据,包括 Broker 列表、主题和分区的状态等。Kafka 集群的每个节点都需要与 ZooKeeper 集群通信。
  8. Controller:Controller 是 Kafka 集群中的一个特殊 Broker,负责监控整个集群的状态,处理故障转移,如分区领导者的选举等。
  9. Log:日志是 Kafka 中存储消息的地方。每个主题的每个分区都有相应的日志,日志由一系列有序的、不可变的消息组成。
  10. Message:消息是 Kafka 中数据的基本单位。消息由一个序列化的字节数组组成,并包含一个可选的键(Key)和一个可选的值(Value)。
  11. Offset:偏移量是 Kafka 中每个消息的唯一序列号,用于追踪消息在日志中的位置。
  12. Replication:复制是 Kafka 提供高可用性的一种机制。每个分区的日志可以被复制到多个 Broker 上,以防止数据丢失。
  13. Leader and Follower:在复制中,每个分区都有一个领导者(Leader)和若干个追随者(Follower)。领导者负责处理所有对该分区的读写操作,而追随者则从领导者那里复制数据。

这些组件共同构成了 Kafka 的核心架构,使其成为一个强大、可靠且可扩展的流处理平台。

一、Kafka重要概念

1.1.1 broker

  • 一个Kafka的集群通常由多个broker组成,这样才能实现负载均衡、以及容错

  • broker是无状态(Sateless)的,它们是通过ZooKeeper来维护集群状态

  • 一个Kafka的broker每秒可以处理数十万次读写,每个broker都可以处理TB消息而不影响性能

1.1.2 zookeeper

  • ZK用来管理和协调broker,并且存储了Kafka的元数据(例如:有多少topic、partition、consumer)

  • ZK服务主要用于通知生产者和消费者Kafka集群中有新的broker加入、或者Kafka集群中出现故障的broker。

PS:Kafka正在逐步想办法将ZooKeeper剥离,维护两套集群成本较高,社区提出KIP-500就是要替换掉ZooKeeper的依赖。“Kafka on Kafka”——Kafka自己来管理自己的元数据

1.1.3 producer(生产者)

  • 生产者负责将数据推送给broker的topic

1.1.4 consumer(消费者)

  • 消费者负责从broker的topic中拉取数据,并自己进行处理

6.1.5 consumer group(消费者组)

1.1.6 分区(Partitions)

  • 在Kafka集群中,主题被分为多个分区

1.1.7 副本(Replicas)

  • 副本可以确保某个服务器出现故障时,确保数据依然可用

  • 在Kafka中,一般都会设计副本的个数>1

1.1.8 主题(Topic)

  • 主题是一个逻辑概念,用于生产者发布数据,消费者拉取数据

  • Kafka中的主题必须要有标识符,而且是唯一的,Kafka中可以有任意数量的主题,没有数量上的限制

  • 在主题中的消息是有结构的,一般一个主题包含某一类消息

  • 一旦生产者发送消息到主题中,这些消息就不能被更新(更改)

1.1.9 偏移量(offset)

  • offset记录着下一条将要发送给Consumer的消息的序号

  • 默认Kafka将offset存储在ZooKeeper中

  • 在一个分区中,消息是有顺序的方式存储着,每个在分区的消费都是有一个递增的id。这个就是偏移量offset

  • 偏移量在分区中才是有意义的。在分区之间,offset是没有任何意义的

二、 消费者组

Kafka支持有多个消费者同时消费一个主题中的数据。我们接下来,给大家演示,启动两个消费者共同来消费 test 主题的数据。

  1. 首先,修改生产者程序,让生产者每3秒生产1-100个数字。

// 3. 发送1-100数字到Kafka的test主题中
while(true) {
    for (int i = 1; i <= 100; ++i) {
        // 注意:send方法是一个异步方法,它会将要发送的数据放入到一个buffer中,然后立即返回
        // 这样可以让消息发送变得更高效
        producer.send(new ProducerRecord<>("test", i + ""));
    }
    Thread.sleep(3000);
}
  1. 接下来,同时运行两个消费者。

  2. 接下来,同时运行两个消费者
  3. 同时运行两个消费者,我们发现,只有一个消费者程序能够拉取到消息。想要让两个消费者同时消费消息,必须要给test主题,添加一个分区。# 设置 test topic为2个分区
    bin/kafka-topics.sh --zookeeper 192.168.88.100:2181 -alter --partitions 2 --topic test


  4. 重新运行生产者、两个消费者程序,我们就可以看到两个消费者都可以消费Kafka Topic的数据了

    一个消费者组中可以包含多个消费者,共同来消费topic中的数据  

    一个topic如果只有一个分区,那么这个分区只能被某个组中的一个消费者消费。 

    有多少个分区,那么就可以被同一个组中的多个消费者消费。

总结

关于 Kafka 核心组件的介绍,掌握 Kafka 中间件,应用在大型分布式项目中,理解 Leader 和 Follower 的工作原理对于深入掌握 Kafka 的数据一致性、高可用性和故障恢复机制非常重要。无论是应对日均亿级消息的挑战,还是构建实时智能系统,掌握Kafka都将成为开发者技术版图中的关键拼图。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。