Kafka 篇:日志、分区、Offset 与高吞吐
Kafka 的核心不是传统队列,而是分布式提交日志。它通过分区、顺序追加、批量 IO 和消费者 Offset 支撑高吞吐数据流。
Kafka 篇:日志、分区、Offset 与高吞吐
Kafka 经常被叫做消息队列,但更准确地说,它是一个分布式事件流平台。它的核心抽象是 append-only log,也就是只能向后追加的日志。
这个设计让 Kafka 特别适合日志采集、实时数仓、行为事件、指标数据和流式计算。
Topic 和 Partition
Topic 是消息分类,Partition 是物理并行单位。
每个 Partition 内部是一段有序日志。生产者不断追加消息,消费者按 Offset 读取消息。
Partition 0:
offset 0 -> offset 1 -> offset 2 -> offset 3
Kafka 的顺序保证是分区级别的,而不是整个 Topic 级别的。要保证同一个订单的事件有序,通常要把 order_id 作为 key。
Offset 是消费进度
Kafka 不会因为某个消费者读了消息就立即删除它。消息按保留策略留在日志里,消费者自己记录 Offset。
这意味着同一份数据可以被多个 Consumer Group 独立消费,也可以在必要时回放。
bootstrap.servers=localhost:9092
group.id=order-report-service
enable.auto.commit=false
auto.offset.reset=earliest
手动提交 Offset 更适合需要可靠处理的业务。处理成功后再提交,失败时可以重新消费。
为什么 Kafka 吞吐高
Kafka 的高吞吐来自几个设计:
- 顺序写磁盘。
- 批量发送和批量读取。
- Page Cache 利用充分。
- Partition 并行。
- 消费者按 Offset 顺序拉取。
Kafka 适合大批量、可顺序追加的数据流。它不适合每条消息都要复杂路由、极低延迟 RPC、或者大量小规模临时队列的场景。
副本和可靠性
Kafka 的 Partition 可以有多个副本。Leader 负责读写,Follower 复制数据。副本机制提升可用性。
生产端可以通过 acks 控制确认级别:
acks=all
enable.idempotence=true
retries=3
acks=all 更可靠,但延迟更高。生产环境通常还会配合幂等生产者和合理的副本数。
Kafka 适合什么
Kafka 非常适合:
- 日志采集。
- 用户行为事件。
- 实时数仓。
- CDC 数据流。
- Flink / Spark Streaming 输入。
- 多系统事件分发。
不太适合:
- 极复杂路由。
- 每条消息独立优先级。
- 大量低吞吐短生命周期队列。
- 需要内置强业务事务语义的场景。
小结
Kafka 的关键不是“队列”,而是“可保留、可回放、可并行消费的分布式日志”。
理解 Partition、Offset、Consumer Group 和副本机制,就理解了 Kafka 为什么适合实时数据链路。