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

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

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

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

Kafka特点:

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

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

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

Broker:Kafka 集群中的每个服务器都称为 Broker。Broker 负责维护数据主题(Topic)的分区(Partition),并处理生产者(Producer)的数据发布和消费者(Consumer)的数据拉取。

Topic:主题是 Kafka 分布式系统中的消息类别。生产者将消息发送到特定的主题,而消费者从一个或多个主题读取消息。

Partition:Partition 是主题的子集,是日志数据的片段。每个主题可以被分割成多个分区,分区允许消息在多个 Broker 之间进行分布,以实现负载均衡和并行处理。

Producer:生产者是向 Kafka 集群发送消息的客户端。生产者负责将数据写入选定的主题和分区。

Consumer:消费者是读取 Kafka 集群中消息的客户端。消费者通常属于一个消费者组(Consumer Group),可以订阅一个或多个主题,并从主题的分区中读取数据。

Consumer Group:消费者组是 Kafka 中的一个核心概念,它允许多个消费者客户端组成一个组,共同处理数据。消费者组内的每个消费者可以独立地从不同的分区读取数据,以实现负载均衡。

ZooKeeper:Kafka 使用 ZooKeeper 来管理集群的元数据,包括 Broker 列表、主题和分区的状态等。Kafka 集群的每个节点都需要与 ZooKeeper 集群通信。

Controller:Controller 是 Kafka 集群中的一个特殊 Broker,负责监控整个集群的状态,处理故障转移,如分区领导者的选举等。

Log:日志是 Kafka 中存储消息的地方。每个主题的每个分区都有相应的日志,日志由一系列有序的、不可变的消息组成。

Message:消息是 Kafka 中数据的基本单位。消息由一个序列化的字节数组组成,并包含一个可选的键(Key)和一个可选的值(Value)。

Offset:偏移量是 Kafka 中每个消息的唯一序列号,用于追踪消息在日志中的位置。

Replication:复制是 Kafka 提供高可用性的一种机制。每个分区的日志可以被复制到多个 Broker 上,以防止数据丢失。

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 主题的数据。

首先,修改生产者程序,让生产者每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);

}

接下来,同时运行两个消费者。

接下来,同时运行两个消费者

同时运行两个消费者,我们发现,只有一个消费者程序能够拉取到消息。想要让两个消费者同时消费消息,必须要给test主题,添加一个分区。# 设置 test topic为2个分区

bin/kafka-topics.sh --zookeeper 192.168.88.100:2181 -alter --partitions 2 --topic test

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

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

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

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

总结

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

相关文章

一个人电饭锅
365平台被黑

一个人电饭锅

⌛ 10-17 👁️‍🗨️ 876
创维电视怎么连接wifi
365提供参考号BAVF

创维电视怎么连接wifi

⌛ 09-02 👁️‍🗨️ 4910
王者荣耀S39赛季持续多少天 王者新赛季有多久
365提供参考号BAVF

王者荣耀S39赛季持续多少天 王者新赛季有多久

⌛ 06-30 👁️‍🗨️ 3360
9月17日明星生日名单
365bet365.com

9月17日明星生日名单

⌛ 10-15 👁️‍🗨️ 925
[邱国珍]文化解密:你所不知道的畲族女神故事
365bet365.com

[邱国珍]文化解密:你所不知道的畲族女神故事

⌛ 07-02 👁️‍🗨️ 4663
福特眼镜蛇多少钱
365提供参考号BAVF

福特眼镜蛇多少钱

⌛ 09-30 👁️‍🗨️ 4915