核心概念
Kafka 基本术语(Topic/Partition/Offset/Broker/副本/重平衡)、核心特性、消息模型、四大核心 API,以及 Kafka 高性能的原理。
基本术语
| 术语 | 说明 |
|---|---|
| 消息(Message) | 数据单元,也称为记录(Record) |
| 批次(Batch) | 消息会分批次写入 Kafka,代指一组消息。批处理能提高吞吐量 |
| 主题(Topic) | 消息的分类。一个 Topic 代表一类消息,可以理解为数据库中的"表" |
| 分区(Partition) | Topic 可被分为多个 Partition,分布在不同 Broker 上,实现水平扩展。单个 Partition 内消息有序,但无法保证跨 Partition 的有序性。例如三个分区:p0: 1 2 3 4 5, p1: 1 2 3, p2: 1 2 3 4 5 6 |
| 生产者(Producer) | 向 Topic 发布消息的客户端 |
| 消费者(Consumer) | 订阅 Topic 并处理消息的客户端 |
| 消费者群组(Consumer Group) | 一个或多个消费者组成的群体。组内消费者共同消费一个 Topic,每条消息只被组内一个消费者处理 |
| 偏移量(Offset) | 消息在 Partition 中的唯一标识,是一个不断递增的整数。用于记录消费进度,在发生重平衡时恢复消费位置 |
| Broker | 一个独立的 Kafka 服务器实例。接收生产者消息、为消息设置 Offset、将消息持久化到磁盘 |
| Broker 集群 | 由多个 Broker 组成。每个集群有一个 Broker 同时充当集群控制器(Controller,通过选举产生) |
| 副本(Replica) | 消息的备份。分为 Leader 和 Follower——Leader 对外提供服务,Follower 被动同步 |
| 重平衡(Rebalance) | 消费者组内某个实例挂掉后,其他实例自动重新分配订阅分区的过程。是实现高可用的重要手段 |
Kafka 核心特性
- 高吞吐、低延迟:Kafka 最大的特点就是收发消息极快,每秒可处理几十万条消息,最低延迟仅几毫秒。
- 高伸缩性:每个 Topic 包含多个 Partition,Partition 可分布在不同的 Broker 上,实现水平扩展。
- 持久性与可靠性:消息被持久化到磁盘(不是存储在 Zookeeper 中!),并支持多副本备份防止数据丢失。Kafka 的元数据(如 Broker 信息、Topic 配置等)存储在 Zookeeper 或 KRaft 中,而消息数据本身存储在本地磁盘上。
- 容错性:允许集群中部分节点失败(只要 ISR 中有足够的副本),集群仍能正常工作。
- 高并发:支持数千个客户端同时读写。
使用场景
| 场景 | 说明 |
|---|---|
| 活动跟踪 | 追踪用户行为:登录、浏览、搜索、购物偏好等,用于生成报表、智能推荐 |
| 消息传递 | 应用程序间的异步通信,如发送通知、状态同步 |
| 度量指标 | 收集分布式应用的运营监控数据,用于报警和报表 |
| 日志记录 | 将数据库更新、应用日志等以统一接口发送到 Kafka,再分发给 Hadoop、HBase、Solr 等下游 |
| 流式处理 | 作为流处理平台(如 Flink、Spark Streaming)的数据源 |
| 限流削峰 | 应对突发流量,将请求写入 Kafka 缓冲,避免直接压垮后端服务 |
Kafka 的消息模型
Kafka 同时支持两种消息模型:
- 点对点模式(P2P):一条消息只被一个消费者消费。同一消费者组内的多个消费者竞争消费。
- 发布-订阅模式(Pub-Sub):一条消息被多个消费者组同时消费(每个组独立维护 Offset)。不同消费者组之间互不影响。
系统架构概览
TODO:在学习理解后补充架构图。
核心 API
Kafka 提供四大核心 API:
| API | 说明 |
|---|---|
| Producer API | 向一个或多个 Topic 发送消息 |
| Consumer API | 订阅一个或多个 Topic 并处理消息流 |
| Streams API | 将程序作为流处理器,消费输入流并生成输出流(数据转换) |
| Connector API | 构建可复用的生产者和消费者,将 Kafka 连接到现有应用或数据系统(如数据库、搜索引擎) |
Kafka 为什么这么快?
Kafka 的核心性能秘诀可以总结为四个要点:
-
顺序读写磁盘:Kafka 将消息以追加(append-only)方式写入日志文件,避免了随机磁盘寻址的巨大开销。顺序磁盘 I/O 的速度甚至可以媲美内存随机读写。
-
零拷贝(Zero Copy):Kafka 利用操作系统的
sendfile()系统调用,数据从磁盘到网络传输过程中无需经过用户态内存拷贝,避免了内核态 ↔ 用户态的上下文切换开销。 -
消息压缩:支持 GZIP、Snappy、LZ4、Zstd 等压缩算法,减少网络传输和磁盘占用。
-
批量发送:从生产者 → 文件系统 → 消费者,数据以批次为单位端到端传输,有效减少 I/O 延迟和网络往返次数。