Kafka 的主题不是一个“盒子”,而是一组分区日志。
Topic: order-events
Partition 0: [0] [1] [2] [3] [4]
Partition 1: [0] [1] [2]
Partition 2: [0] [1] [2] [3]这里最关键的认知有 3 个。
#1. offset 只在“分区内”有意义
很多人第一次学 Kafka,会以为 offset 是整个 topic 的全局编号。不是。
正确理解是:
Partition 0有自己的offset 0,1,2...Partition 1也有自己的offset 0,1,2...- 不存在“整个 topic 的全局统一 offset”
也就是说:
order-events / partition-0 / offset-7
order-events / partition-2 / offset-7这是两条完全不同的记录。
#2. partition 是扩容单位,不只是存储单位
为什么要分区?
因为单条轨道吞吐有限,Kafka 用多条分区并行处理:
- 写入可以并行
- 消费可以并行
- 存储可以分布到不同 broker
所以分区本质上是在解决:
如何把一个超大的事件流拆成多条并行干线。
#3. 顺序只在分区内成立
Kafka 能稳定保证的是:
- 同一个 partition 内,记录按写入顺序追加
- 不同 partition 之间,没有天然全局顺序
这个结论重要到值得单独写一遍:
分区内有序
≠
整个 topic 全局有序