Kafka 篇:日志、分区、Offset 与高吞吐

Kafka 的核心不是传统队列,而是分布式提交日志。它通过分区、顺序追加、批量 IO 和消费者 Offset 支撑高吞吐数据流。

Kafka 篇:日志、分区、Offset 与高吞吐

Kafka 经常被叫做消息队列,但更准确地说,它是一个分布式事件流平台。它的核心抽象是 append-only log,也就是只能向后追加的日志。

这个设计让 Kafka 特别适合日志采集、实时数仓、行为事件、指标数据和流式计算。

Rendering diagram...

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 为什么适合实时数据链路。

参考链接