Kafka 核心回顾:Topic、Partition、Producer、Consumer、Offset 机制
聊 Kafka 和 Iceberg 的集成之前,我觉得有必要先把 Kafka 的几个核心概念再过一遍。说白了,这些概念就是整个消息系统的地基。地基不稳,后面搭什么都白搭。
我记得刚接触 Kafka 那会儿,被 Topic 和 Partition 的关系绕得有点晕。后来在线上压测时踩过坑,才真正理解它们的设计意图。今天咱们就一个一个捋清楚。
Topic:逻辑上的消息分类
Topic 是 Kafka 里最上层的抽象。你可以把它理解成一个消息的「分类标签」。比如订单系统,我会建一个 order_events Topic;用户行为日志,就建一个 user_actions Topic。
每个 Topic 可以承载任意数量的消息,消息本身没有上限。但 Topic 本身不存数据,它只是一个逻辑概念。真正扛数据的是 Partition。
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,进程就挂了。重启后重复消费了上万条消息,下游的数据库被写爆了。从那以后,核心链路我都改成了手动提交。
整体架构图
下面这张图把 Topic、Partition、Producer、Consumer 和 Offset 的关系串起来了。你可以看到消息从 Producer 写入,经过 Broker 存储,再到 Consumer 消费的完整链路。
小结
Topic 是分类,Partition 是分片,Producer 写数据,Consumer 读数据,Offset 记进度。这五个概念构成了 Kafka 最核心的数据流转模型。