Kafka 核心回顾:Topic、Partition、Producer、Consumer、Offset 机制

聊 Kafka 和 Iceberg 的集成之前,我觉得有必要先把 Kafka 的几个核心概念再过一遍。说白了,这些概念就是整个消息系统的地基。地基不稳,后面搭什么都白搭。

我记得刚接触 Kafka 那会儿,被 Topic 和 Partition 的关系绕得有点晕。后来在线上压测时踩过坑,才真正理解它们的设计意图。今天咱们就一个一个捋清楚。

Topic:逻辑上的消息分类

Topic 是 Kafka 里最上层的抽象。你可以把它理解成一个消息的「分类标签」。比如订单系统,我会建一个 order_events Topic;用户行为日志,就建一个 user_actions Topic。

每个 Topic 可以承载任意数量的消息,消息本身没有上限。但 Topic 本身不存数据,它只是一个逻辑概念。真正扛数据的是 Partition。

我的习惯:Topic 命名尽量带上业务含义和版本号,比如 order_events_v2。这样后续做数据迁移或兼容性升级时,一眼就能看出用途。

Partition:物理存储的最小单元

Partition 才是 Kafka 真正存数据的地方。一个 Topic 可以拆成多个 Partition,每个 Partition 是一个有序的、不可变的日志文件。

为什么要拆?说白了就是为了水平扩展。单台机器的磁盘和网络带宽是有限的,把数据分散到多个 Partition 上,就能让多台 Broker 一起扛流量。

我曾在一次大促活动中,把一个 Topic 从 3 个 Partition 扩到 12 个,消费吞吐量直接翻了 3 倍多。嗯,这里要注意:Partition 数量不是越多越好。太多 Partition 会导致文件句柄膨胀、Leader 选举变慢。我个人建议,单个 Broker 上的 Partition 总数不要超过 2000。

概念 层级 特点
Topic 逻辑层 消息分类,无物理存储
Partition 物理层 有序日志,可水平扩展
Segment 文件层 Partition 内部的文件段,可滚动删除

Producer:消息的写入者

Producer 负责把消息发到指定的 Topic。它有几个关键参数,我每次配置时都会反复确认。

  • acks:确认级别。0 表示发完不管,1 表示 Leader 确认,all 表示所有副本确认。我一般生产环境用 acks=all,虽然慢一点,但不会丢数据。
  • retries:重试次数。网络抖动是常态,我习惯设成 3 次以上。
  • batch.size:批量发送的大小。调大这个值能提升吞吐,但会增加延迟。需要根据业务场景权衡。
我曾经踩过的坑:有一次把 acks 设成了 0,结果 Broker 宕机时丢了上千条订单消息。从那以后,凡是涉及钱的业务,我绝不用 acks=0。

Consumer 与 Consumer Group

Consumer 从 Partition 里拉取消息。但单个 Consumer 处理能力有限,所以有了 Consumer Group 的概念。

同一个 Group 内的 Consumer 共同消费一个 Topic。每个 Partition 只能被 Group 内的一个 Consumer 消费。这就是所谓的「分区分配」。

你想想看,如果 Group 内有 3 个 Consumer,Topic 有 6 个 Partition,那每个 Consumer 会分到 2 个 Partition。如果 Consumer 数量超过 Partition 数量,多出来的 Consumer 就会闲置。

我建议:Consumer 数量不要超过 Partition 数量,否则就是资源浪费。

Offset:消费进度的指针

Offset 是 Kafka 里最容易被忽视、但最重要的概念。每个 Partition 内的消息都有一个唯一的 Offset,从 0 开始递增。Consumer 通过记录 Offset 来知道自己消费到了哪里。

Offset 的提交方式有两种:

  • 自动提交:默认每 5 秒提交一次。简单,但可能丢数据或重复消费。
  • 手动提交:业务处理完后再提交。更可靠,但代码复杂度高一些。

我记得有一次线上事故,就是因为自动提交导致消费端处理完消息后还没提交 Offset,进程就挂了。重启后重复消费了上万条消息,下游的数据库被写爆了。从那以后,核心链路我都改成了手动提交。

核心要点:Offset 是 Kafka 保证「至少一次语义」的关键。配合 Iceberg 的 ACID 事务,可以实现端到端的精确一次语义。

整体架构图

下面这张图把 Topic、Partition、Producer、Consumer 和 Offset 的关系串起来了。你可以看到消息从 Producer 写入,经过 Broker 存储,再到 Consumer 消费的完整链路。

Kafka 核心架构图 Producer Kafka Broker Topic Partition 0 Partition 1 Partition 2 Offset: 0,1,2,... Offset: 0,1,2,... Offset: 0,1,2,... Consumer Group Consumer 0 Consumer 1 Offset 存储在 __consumer_offsets Topic

小结

Topic 是分类,Partition 是分片,Producer 写数据,Consumer 读数据,Offset 记进度。这五个概念构成了 Kafka 最核心的数据流转模型。