Kafka 是什么
Kafka 是分布式的发布订阅事件流平台:消息以追加日志的形式持久化到磁盘,按分区并行读写,靠多副本容错。它同时承担三件事——解耦上下游的缓冲层、多条链路共享的数据总线、流处理任务的输入输出通道。
为什么用日志模型
日志追加是顺序写,磁盘顺序写性能接近内存随机写,这让 Kafka 用普通磁盘就能扛住很高的吞吐。更重要的是「读取不删除数据」:消费只推进位移,消息由保留策略统一清理,所以同一份数据可以被多个消费组各读一遍,也可以按位点重放做补数。
基本信息
| 定位 | 分布式事件流/消息平台 |
|---|---|
| 核心抽象 | Topic、Partition、Producer、Consumer、Broker |
| 存储模型 | 分区内追加日志,按位移读取,保留期内可重放 |
| 容错 | 每分区一个 Leader 加若干 Follower,ISR 内选举 |
| 典型用途 | 链路解耦、削峰缓冲、实时计算输入输出、变更数据分发 |
典型使用场景
- 业务库变更经 CDC 进 Kafka,再分发给数仓、缓存与检索多条下游
- 订单、支付等高峰流量先入队列削峰,下游按自身能力消费
- 作为实时流的输入输出:Flink 读一个主题、写另一个主题
- 跨系统解耦:上游只管投递,新增下游不需要改动上游
- 作为临时数据缓冲保留若干天,方便下游故障后重放补数
组成示意
组成示意
# 一个主题被拆成多个分区,分区分布在多个 Broker 上
Producer → Broker(Topic orders:Partition 0/1/2,每个分区 1 个 Leader + 2 个 Follower)→ Consumer
# 分区内严格有序,跨分区不保证顺序
Partition 0: [offset 0][1][2][3] ... ← 追加写入,只能往末尾加
Partition 1: [offset 0][1][2]
# 消费组按分区分配:组内一个分区同一时刻只归一个成员
Consumer Group A ── 各成员分到不同分区,合起来读完整个主题核心概念读法
| 概念 | 含义 | 要点 |
|---|---|---|
| Topic | 消息的逻辑分类 | 分区数与保留策略都定义在主题上 |
| Partition | 并行与顺序的基本单位 | 分区内有序,跨分区无序 |
| Offset | 分区内的消息编号 | 删除消息不会改变已有编号 |
| Broker | 一个 Kafka 服务节点 | 集群里由 Controller 协调元数据 |
| Replica / ISR | 分区副本与同步副本集合 | ISR 收缩是保护动作,抖动才需要排查 |
Kafka 不是传统意义上的队列:消息被消费后不会立刻删除,删除只由保留时间或保留容量触发。把这一点搞反,会导致「消费了为什么还能重放」的疑问反复出现。
把 Kafka 当日志库长期存储需要先算清磁盘成本:数据量 × 副本数 ÷ 压缩率 × 保留天数就是实际占用,副本数常被忽略。