enyang
enyang
Published on 2025-11-18 / 12 Visits
0
0

Kafka基础

1. Kafka 基础概念

1.1 Kafka 的基本组成

Kafka 是一个分布式流平台,以下是 Kafka 的核心组成部分:

  • Producer(生产者):负责将消息发送到 Kafka 的指定 Topic

  • Consumer(消费者):从 Kafka 中订阅消息,消费消息。

  • Topic(主题):消息的分类方式。Producer 将消息发送到某个 Topic,Consumer 从某个 Topic 中消费消息。

  • Partition(分区):每个 Topic 可以分为多个 Partition,消息被存储在 Partition 中。每个 Partition 可以分布到不同的 Broker 上,Kafka 通过分区实现水平扩展。

  • Broker(代理):Kafka 集群中的节点,负责存储消息并提供读取服务。Kafka 集群通常由多个 Broker 组成。

  • ZooKeeper:Kafka 使用 ZooKeeper 来进行集群管理、选举领导者(Leader)、协调节点之间的状态等。注意,在新版本的 Kafka 中,Kafka 正在逐步去除对 ZooKeeper 的依赖。

1.2 Kafka 的核心组件

Producer(生产者)
  • Producer 是向 Kafka 发送消息的客户端,生产者通过指定 Topic 将消息发送给 Kafka。

  • 生产者可以将消息发送到特定的 Partition,也可以由 Kafka 自动选择分区。

  • Kafka 在高吞吐量的环境下优化了生产者的性能,支持异步发送、批量发送等方式。

Consumer(消费者)
  • Consumer 是从 Kafka 订阅并消费消息的客户端,消费者可以按 Topic 来订阅消息。

  • 消费者会从 Kafka 中获取消息并进行处理,可以使用 消费组(Consumer Group) 来实现并行消费。

Topic(主题)
  • Topic 是 Kafka 用来组织和分类消息的方式。生产者将消息发送到特定的 Topic,消费者通过订阅 Topic 来消费消息。

  • 每个 Topic 可以有多个 Partition,消息会被分配到多个 Partition 中,Kafka 可以通过多个 Partition 来提高吞吐量。

Partition(分区)
  • Kafka 的 Topic 会被分为多个 Partition。每个 Partition 是一个有序的消息日志(Message Log)。

  • Kafka 会根据某种规则(通常是消息的 Key)将消息分配到不同的 Partition 中。每个 Partition 是一个线性的消息队列,消息会按顺序写入,并且每条消息有一个唯一的 Offset(偏移量)。

  • 通过分区,Kafka 可以扩展吞吐量和并发能力,多个消费者可以并行消费不同的 Partition 中的消息。

Broker(代理)
  • Broker 是 Kafka 集群中的节点,负责接收、存储和分发消息。

  • Kafka 集群可以有多个 Broker,消息会在多个 Broker 之间分布。每个 Broker 会管理一些 Topic 和 Partition,多个 Broker 共同组成 Kafka 集群。

ZooKeeper(协调者)
  • ZooKeeper 是 Kafka 的元数据存储和协调工具,负责 Kafka 集群的管理和协调。

  • ZooKeeper 主要用于管理 Kafka 集群中的节点信息、Topic 配置、Partition 分配、以及消费者的位移(offset)等元数据。

  • Kafka 集群中的每个 Broker 都会与 ZooKeeper 进行交互。ZooKeeper 会监控集群中 Broker 的状态,并在某个 Broker 宕机时进行自动的故障转移。

2. Kafka 的数据流

2.1 生产者将消息发送到 Kafka

  1. Producer 会选择一个 Topic,并将消息发送到该 Topic。

  2. Kafka 会根据配置(比如 Key、分区数等)决定将消息发送到 哪个 Partition

  3. 消息被写入到指定 Partition 中,Kafka 会记录下该消息的 Offset,即该消息在 Partition 中的位置信息。

2.2 Kafka 存储消息

  1. 每个 Topic 会有多个 Partition,每个 Partition 存储一部分消息。

  2. Kafka 将消息持久化到磁盘,保证消息不会丢失。Kafka 通过顺序写入磁盘的方式,保证了高吞吐量。

  3. Kafka 还会为每个 Partition 创建 多个副本(Replication)。副本存储在不同的 Broker 上,保证高可用性。

2.3 消费者从 Kafka 中消费消息

  1. Consumer 会订阅一个或多个 Topic。

  2. 消费者根据 Consumer Group 来消费消息,一个 Consumer Group 中的多个消费者共同消费 Topic 中的消息。

  3. 消费者从 Kafka 中读取消息,消息的 Offset 会记录在 ZooKeeper 或 Kafka 自己的内部存储中,确保消费者在下次消费时能够从上次的位置继续消费。

3. Kafka 的消息存储与分发

3.1 消息持久化

Kafka 是一个持久化的消息队列,它将消息存储在磁盘上。每个 Topic 分为多个 Partition,消息被写入到 Partition 中,并存储在磁盘上。

  • 顺序写入:Kafka 将消息顺序地写入磁盘,这使得 Kafka 在磁盘上写入消息时非常高效。

  • 消息过期与保留策略:每个 Partition 的消息会根据配置的 保留时间消息大小 来决定是否删除。默认情况下,消息会保存 7 天,超过这个时间后会被删除。

3.2 消息副本与高可用性

为了保证消息不丢失,Kafka 使用了 副本机制。每个 Partition 都有多个副本,这些副本存储在不同的 Broker 上。

  • Leader 和 Follower:每个 Partition 都有一个 Leader 副本,Leader 负责读写请求,其他副本是 Follower 副本。Follower 副本会同步 Leader 副本中的数据。

  • 副本数:副本的数量可以配置,通常设置为 2 或 3 个副本。如果某个副本的 Broker 宕机,Kafka 会自动将 Leader 副本转移到其他 Broker,确保消息不会丢失。

3.3 消息分区与负载均衡

Kafka 通过将一个 Topic 分成多个 Partition 来实现 负载均衡。每个 Partition 存储部分消息,Kafka 会根据消息的 Key(通常是消息的某个字段)来将消息分配到不同的 Partition 中。

  • Partition 的数量:Topic 可以有多个 Partition,增加 Partition 的数量可以提高系统的吞吐量,但也会增加消费端的复杂性。

  • 消费者组:Kafka 的消费者是按 消费者组(Consumer Group) 来消费消息的。每个消费者组中的消费者共享同一个 Topic,并且每个消费者只会消费该 Topic 中一个 Partition 的消息。多个消费者可以并行消费不同 Partition 中的消息。

4. Kafka 的消息消费模式

4.1 发布/订阅模式 (Pub/Sub)

在发布/订阅模式中,消费者独立消费消息,每个消费者都会接收到 Topic 中的所有消息。

  • Producer 向 Topic 发布消息,所有订阅该 Topic 的 Consumer 都会接收到消息。

  • 可以有多个消费者订阅同一个 Topic,Kafka 会将消息分发给所有的消费者。

4.2 队列模式 (Queue)

在队列模式中,多个消费者可以共享消费同一个 Topic 中的消息,但每个消息只能被一个消费者消费。

  • Consumer Group:一个消费者组中的多个消费者共享消费同一个 Topic 的消息,每个消费者只会消费 Topic 中某个 Partition 的消息。

5. Kafka 的高级特性

5.1 消息的幂等性

Kafka 支持幂等性,即即使消息被重复发送,也能保证只消费一次。这对于需要保证消息唯一性和准确性的场景非常重要。

5.2 事务支持

Kafka 也支持事务,使得生产者能够发送多个消息到不同的 Partition,并保证这些消息要么全部成功,要么全部失败,从而提供 原子性


Comment