Kafka 简介
Apache Kafka 是一个开源的分布式事件流平台,由 LinkedIn 开发并捐赠给 Apache 基金会,使用 Java 和 Scala 编写。Kafka 以高吞吐、低延迟、持久化著称,广泛应用于消息队列、日志收集、流处理、事件溯源等场景。
与消息队列对比
| 对比 | 传统 MQ(RabbitMQ) | Kafka |
|---|---|---|
| 消息模型 | 消费后删除 | 持久化到磁盘,基于 Offset 消费 |
| 吞吐量 | 万级/秒 | 百万级/秒 |
| 延迟 | 微秒级 | 毫秒级 |
| 消费模式 | Push(Broker 推) | Pull(Consumer 拉) |
| 数据回溯 | 不支持 | 支持,可重复消费历史数据 |
| 顺序保证 | 全局无序 | Partition 内有序 |
| 扩展方式 | 垂直扩展为主 | 水平扩展(Partition + Broker) |
核心特性
- 高吞吐:顺序写入磁盘 + Page Cache + 零拷贝(sendfile)实现百万级 QPS
- 持久化:消息写入磁盘,默认保留 7 天,支持回溯消费
- 水平扩展:通过增加 Broker 和 Partition 线性扩展吞吐
- 高可用:副本机制(ISR),Broker 故障自动 Leader 切换
- Pull 模型:Consumer 按自身节奏拉取,避免 Push 导致的消费方过载
核心概念
消息模型
Producer-1 ──┐ ┌── Consumer-1 (Group-A)
├── Topic "orders" ──┤
Producer-2 ──┘ Partition-0 ├── Consumer-2 (Group-A)
Partition-1 │
Partition-2 └── Consumer-3 (Group-B) ← 独立消费| 概念 | 说明 |
|---|---|
| Producer | 生产者,向指定 Topic 发送消息,可指定 Partition 或自动分区 |
| Consumer | 消费者,从 Topic 拉取消息,属于某个 Consumer Group |
| Broker | Kafka 服务节点,一个集群包含多个 Broker |
| Topic | 消息的逻辑分类,类似数据库的"表" |
| Partition | Topic 的物理分片,每个 Partition 是一个有序、不可变的消息序列 |
| Offset | 消息在 Partition 中的唯一递增编号,Consumer 用 Offset 标记消费位置 |
| Consumer Group | 消费者组,组内每个 Consumer 负责不同 Partition,实现负载均衡 |
消息结构
| 字段 | 说明 |
|---|---|
| Key | 可选,用于分区路由;相同 Key 的消息进入同一 Partition |
| Value | 消息体,字节数组,支持任意序列化格式 |
| Headers | 可选,键值对元数据(用于链路追踪等) |
| Timestamp | 消息时间戳(CreateTime / LogAppendTime) |
基本操作
shell
# 创建 Topic
kafka-topics.sh --create --topic test --partitions 3 --replication-factor 1 \
--bootstrap-server localhost:9092
# 查看 Topic 列表
kafka-topics.sh --list --bootstrap-server localhost:9092
# 生产消息
kafka-console-producer.sh --topic test --bootstrap-server localhost:9092
# 消费消息
kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server localhost:9092KRaft 模式(推荐)
Kafka 2.8+ 引入了 KRaft(Kafka Raft)模式,用内置 Raft 协议取代 ZooKeeper 进行元数据管理,Kafka 3.3+ 生产可用,3.7+ 已弃用 ZooKeeper 模式。
| 对比 | ZooKeeper 模式 | KRaft 模式 |
|---|---|---|
| 外部依赖 | 需要 ZooKeeper 集群 | 无,自包含 |
| 运维复杂度 | 高,两套系统 | 低,仅 Kafka 自身 |
| 元数据恢复 | 依赖 ZK 快照 | Kafka 内置 Raft 日志 |
| Partition 上限 | ~200K/集群(ZK 瓶颈) | ≥ 2M/集群 |
| 部署组件 | Broker + Controller(ZK 选主) | Broker + Controller(Raft 选主) |