1. 什么是Kafka
Apache Kafka是一个开源的分布式流处理平台,最初由LinkedIn开发并于2011年开源,后来成为Apache软件基金会的顶级项目。 该项目用 Scala 语言编写,核心设计目标是“高吞吐、可水平扩展、持久化、顺序读写”。 它把消息以“日志”形式顺序追加到磁盘,通过零拷贝技术实现每秒百万级消息的传输,既充当实时数据管道,也充当流式计算平台的数据源。
2. 核心架构
Kafka 的核心架构围绕生产者(Producer)、代理(Broker)、主题(Topic)、分区(Partition)、消费者(Consumer)和消费者组(Consumer Group)等组件构建。 每个组件都有特定的功能和责任,协同工作以实现高吞吐量、低延迟的消息传递。
2.1. 生产者(Producer)
作用
负责将消息发送到 Kafka 集群。
关键特性
- 分区选择:生产者可以指定消息发送到哪个分区(如通过键的哈希值),或由 Kafka 自动分配(轮询策略)。
- 批量发送:通过批量压缩和批量发送(batch.size 和 linger.ms 参数)提高吞吐量。
- 异步/同步发送:支持异步(非阻塞)或同步(阻塞等待确认)发送模式。
- 消息确认机制:生产者可配置 acks 参数(0、1、all)控制消息持久化的可靠性。
2.2. 代理(Broker)
作用
Kafka 集群的节点,负责存储和处理生产者发送的消息。
关键特性
- 无状态设计:Broker 不保存消费者状态,仅存储消息和元数据(如分区位置)
- Zookeeper 依赖(旧版):管理集群元数据(如 Broker 列表、主题分区分配),新版 Kafka 逐步移除 Zookeeper(采用 KRaft 模式)。
- ISR(In-Sync Replicas):同步副本列表,确保数据高可用性
2.3. 主题(Topic)
作用
Kafka 中用于组织和分类消息的逻辑容器。生产者发送消息到特定主题,消费者从主题订阅消息。
关键特性
- 多分区:一个主题可划分为多个分区(如 orders 主题有 10 个分区),分散存储和负载均衡,用于实现并行处理和水平扩展。
- 副本机制:每个分区有多个副本(如副本因子 replication.factor=3),分布在不同 Broker 上。
2.4. 分区(Partition)
作用
分区是主题的物理容器,是主题的最小存储单元,消息按分区顺序存储,每个分区是一个有序的、不可变的消息队列。
关键特性
- 有序性:同一分区内的消息严格按写入顺序消费(但跨分区无序)。
- 偏移量(Offset):每条消息在分区内的唯一标识,消费者通过偏移量记录消费进度。
- Leader/Follower:每个分区有一个 Leader(处理读写请求)和多个 Follower(同步数据)。
2.5. 消费者(Consumer)
作用
消费者是从 Kafka 集群接收消息的应用程序或服务。
关键特性
- 订阅主题:消费者可以订阅一个或多个主题(Topic),以接收该主题的消息。
- 分区分配:消费者组中的每个消费者实例负责从一个或多个分区(Partition)读取消息。
- 偏移量管理:消费者通过偏移量记录消费进度,确保每个消息只被消费一次(at-least-once)。
- 自动提交偏移量:消费者可以配置自动提交偏移量(enable.auto.commit=true),或手动提交(poll 后调用 commitSync/Async)。
2.6. 消费者组(Consumer Group)
作用
消费者组是一个或多个消费者实例的逻辑集合,共同消费一个主题的分区。
关键特性
- 分区分配:消费者组中的每个消费者实例负责从一个或多个分区(Partition)读取消息。
- 负载均衡:Kafka 自动分配分区给消费者组中的实例,实现负载均衡。
- 故障容错:如果一个消费者实例失败,其负责的分区会被重新分配给其他实例,确保高可用性。
- 水平扩展:通过增加消费者数量(增加消费者组中的实例数),可以实现并行处理和提高消费吞吐量(但不超过分区数)。