Kafka是大型架构的必备技能,下面我重点来详解Kafka原理@mikechen
Kafka原理
Kafka 是一个高吞吐、分布式、可持久化的消息系统。
Kafka核心,由以下几个组件组成:
Producer(生产者)
生产者负责将数据写入 Kafka 的指定 Topic,关键特性包括:
发送机制:生产者通过网络向 Kafka Broker 发送消息,支持异步和同步发送方式。
分区策略:默认通过轮询或 hash(key) 来选择 Partition;也可自定义分区器。
批量发送(batching):为了提升吞吐量,Kafka 支持将多条消息打包成批进行发送。
幂等性与事务性:开启幂等性后,Kafka 能防止重复写入;事务性Producer可以保证跨分区的原子性写入。
Consumer(消费者)
消费者负责从 Kafka 中拉取消息进行消费,关键特性包括:
拉模式消费:Kafka 采用拉取(pull)模式,由消费者主动请求数据。
消费者组(Consumer Group):多个消费者可组成一个组,组内的消费者分摊分区,达到水平扩展。
Offset 管理:消费者负责管理自己消费的位置(offset),可选择自动或手动提交。
再均衡机制(Rebalance):当消费者变化(上下线)时,Kafka 会触发重新分配分区,保证分区只被一台消费者消费。
Broker(服务节点)
Broker 是 Kafka 集群中的一个服务实例,通常运行在一台或多台服务器上。
Kafka 集群:由一个、或多个 Broker 组成,其职责包括:
Broker 负责接收 Producer 发送的消息,并将这些消息持久化到本地磁盘。
管理 Partition, 每个 Broker 可以管理一个、或多个 Topic 的 Partition。
Kafka 通过副本机制来提高数据的可靠性,每个 Partition 可以有多个副本,分布在不同的 Broker 上。
还负责Leader 选举,每个 Partition 有一个 Leader Broker 负责读写操作,其他副本为 Follower,只做同步。
Topic & Partition(主题与分区)
Kafka 以 Topic 为基本的数据分类单位:
Topic:逻辑上类似于一个日志主题,生产者往 Topic 写入数据,消费者从中读取。
Partition:为了实现并发和分布式处理,每个 Topic 可以被划分为多个 Partition,分布在不同 Broker 上。
Offset:每个 Partition 内部的消息都有一个唯一编号,称为 Offset,用于追踪消费进度。
Zookeeper / KRaft(元数据管理)
在早期的 Kafka 版本中,ZooKeeper 是 Kafka 集群的关键外部依赖,负责管理 Kafka 的元数据信息。
ZooKeeper 的性能瓶颈,可能会影响 Kafka 集群的扩展性,所以现在逐步过渡到 KRaft 模式(Kafka 自身实现的元数据服务)。
KRaft 模式(Kafka Raft),Kafka 自主实现 Raft 协议,不依赖 Zookeeper;
Kafka 工作流程
Kafka 的核心工作流程可以概括为“生产 – 存储 – 消费”三阶段:
1.生产阶段
Producer 将消息发送到 Kafka 的某个 Topic;
Kafka 根据分区规则决定数据写入哪个 Partition;
数据首先写入内存缓冲区,然后刷入磁盘中的日志文件。
2.存储阶段
Kafka 将数据以 Segment 文件形式存储在磁盘上;
利用顺序写+Page Cache 机制实现高吞吐;
数据可以根据时间/大小进行自动清理或压缩。
3.消费阶段
Consumer 拉取 Topic 中的 Partition 数据;
按 offset 顺序读取;
消费完成后提交 offset(位点);
消费者组可实现分区并行消费,提高处理能力。