Skip to content

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
BrokerKafka 服务节点,一个集群包含多个 Broker
Topic消息的逻辑分类,类似数据库的"表"
PartitionTopic 的物理分片,每个 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:9092

KRaft 模式(推荐)

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 选主)

参考