2. 核心概念扫盲

好,咱们正式开始啃 Kafka 的核心概念。说实话,很多初学者一上来就被这七八个术语搞懵了。我当年也是,看了半天文档,脑子里还是一团浆糊。后来我带团队做第一个 Kafka 项目时,因为没搞懂 Partition 和 Offset 的关系,线上丢过数据——嗯,那滋味可不好受。

今天咱们就把这些概念一个一个掰开揉碎。你跟着我走一遍,保证能串起来。

1. Broker:Kafka 的服务器节点

Broker 说白了就是一台运行 Kafka 进程的服务器。一个集群由多个 Broker 组成,每个 Broker 有一个唯一 ID(数字)。

我个人习惯把 Broker 想象成「仓库管理员」。你往 Kafka 写数据,其实就是把货交给管理员,他负责存好、看好,别人来取时再给出去。

关键点:Broker 本身是无状态的,数据都存磁盘上。但集群的元数据(谁负责哪个分区)由 ZooKeeper 或 KRaft 管理。

2. Topic:数据的逻辑分类

Topic 就是消息的类别。比如你有个订单系统,可以建一个 order_topic;用户登录日志,放 user_login。Producer 往 Topic 写,Consumer 从 Topic 读。

Topic 只是一个逻辑概念,真正存数据的是 Partition。

3. Partition:真正的存储单元

每个 Topic 可以分成多个 Partition。Partition 是一个有序的、不可变的日志文件(append-only log)。

为什么要分区?两个原因:

  • 水平扩展:一个 Topic 的数据可以分散到多台 Broker 上
  • 并行读写:多个 Consumer 可以同时消费不同 Partition

我在项目中遇到过一个问题:某个 Topic 只设了 1 个 Partition,结果 Consumer 集群有 10 个节点,9 个闲着。后来改成 6 个 Partition,吞吐量直接翻了 5 倍。

经验之谈:Partition 数量不是越多越好。太多会导致文件句柄暴增、Leader 选举变慢。一般建议 Partition 数 = max(Consumer 数, Broker 数) × 2 左右。

4. Offset:消息的唯一编号

每条消息写入 Partition 后,Kafka 会给它一个递增的整数编号,这就是 Offset。它唯一标识 Partition 内的一条消息。

Offset 从 0 开始,单调递增,不会重复。Consumer 通过记录 Offset 来知道自己消费到了哪里。

我曾经犯过一个错:以为 Offset 是全局唯一的。其实 Offset 只在 Partition 内唯一。不同 Partition 的 Offset 是独立的,可能都是 0、1、2……

避坑指南:Consumer 重启后,如果 Offset 提交失败,可能会重复消费或漏消费。我建议用自动提交(enable.auto.commit=true)配合合理间隔,或者手动提交做精确控制。

5. Producer:消息的生产者

Producer 负责把消息发到指定的 Topic。它可以选择发到哪个 Partition:

  • 指定 Partition:直接传分区号
  • 指定 Key:对 Key 做哈希,相同 Key 的消息进同一分区
  • 轮询:不指定时,Kafka 默认轮询分配

Producer 还有三个重要参数:

参数 说明 我的建议
acks 0 / 1 / all 重要数据用 all,日志类用 1
retries 重试次数 设 3 次以上,防止网络抖动
batch.size 批量发送大小 16KB 起步,压测调优

6. Consumer & Consumer Group:消息的消费者

Consumer 从 Topic 拉取数据。但真正有意思的是 Consumer Group。

一个 Consumer Group 包含多个 Consumer 实例。Group 内的每个 Consumer 负责消费不同的 Partition。这样就能并行处理,提高吞吐量。

举个例子:Topic 有 6 个 Partition,Group 有 3 个 Consumer,那每个 Consumer 分 2 个 Partition。如果 Group 有 7 个 Consumer,那就有 1 个闲着——因为 Partition 只有 6 个。

核心规则:同一个 Partition 只能被同一个 Group 内的一个 Consumer 消费。但不同 Group 可以独立消费同一个 Partition——这就是发布/订阅模式。

7. 一张图串起所有概念

下面这张图展示了 Producer、Broker、Partition、Consumer Group 之间的完整关系。你盯着看 30 秒,比读十页文档都管用。

Kafka 核心概念关系图 Producer Broker 1 Broker 2 Partition 0 Partition 1 Partition 2 Offset: 0,1,2,... Offset: 0,1,2,... Offset: 0,1,2,... Consumer Group Consumer 1 Consumer 2 Consumer 3 图例 Producer Broker Partition Consumer

8. 把这些概念串起来

咱们用一句话总结整个流程:

Producer 把消息发到 Topic 的某个 Partition,Broker 负责存储,并为每条消息分配一个递增的 Offset。Consumer Group 内的多个 Consumer 各自负责消费不同的 Partition,通过记录 Offset 来保证不丢不重。

你想想看,这其实就是一个「生产-存储-消费」的管道模型。Kafka 的高吞吐、高可用,全靠 Partition 的并行和 Offset 的精确控制。

我的习惯:每次设计 Topic 时,先问自己三个问题——数据量多大?Consumer 有几个?允许丢数据吗?答案清楚了,Partition 数和副本数自然就定了。

好了,核心概念就这些。你先把这张图刻在脑子里,后面讲高可用架构时,咱们会反复用到这些术语。