3. Kafka核心概念:Topic、Partition、Producer、Consumer、Broker、Offset

说实话,Kafka 的概念其实不多,但每个都挺关键。我刚接触那会儿,总觉得这些名词绕来绕去,后来在项目里踩了几次坑,才真正搞明白它们之间的关系。

今天咱们就把这六个核心概念掰开揉碎,一个一个说清楚。

3.1 Broker——Kafka 的服务器节点

Broker 是 Kafka 集群里的一个服务器实例。说白了,它就是一台跑着 Kafka 进程的机器。

  • 每个 Broker 都有一个唯一 ID(数字)
  • 多个 Broker 组成一个集群
  • 客户端连接任意一个 Broker 就能访问整个集群
我的习惯:生产环境至少部署 3 个 Broker。单节点虽然能跑,但一旦宕机,整个系统就挂了。我见过有人用 2 个节点,结果网络分区时两边都以为对方挂了,数据就乱了。

3.2 Topic——消息的逻辑分类

Topic 是 Kafka 里最基础的概念。你可以把它理解成一个消息的“类别”或“主题”。

举个例子:我们做行为流采集,用户点击、页面浏览、下单支付,这些事件可以分别放到 click_topic、page_view_topic、order_topic 里。

每个 Topic 可以有多个消费者订阅,互不干扰。生产者只管往 Topic 里写,消费者只管从 Topic 里读,两边解耦。

关键点:Topic 只是一个逻辑概念,真正存储数据的是 Partition。

3.3 Partition——真正的存储单元

Partition 是 Kafka 实现高吞吐的核心。一个 Topic 会被分成多个 Partition,每个 Partition 是一个有序的、不可变的日志文件。

为什么要分区?

  • 并行读写:多个 Partition 可以分布在多个 Broker 上,读写可以并行
  • 水平扩展:数据量大了,加 Partition 就行
  • 负载均衡:不同 Partition 可以分配到不同 Broker

我记得有一次,线上一个 Topic 只有一个 Partition,消费者处理不过来,消息积压了几百万条。后来改成 6 个 Partition,问题立刻解决了。

注意:Partition 内的消息是有序的,但跨 Partition 不保证顺序。如果你需要严格有序,只能用一个 Partition——但那样吞吐量就上不去了。

3.4 Offset——消息的唯一编号

每个 Partition 里的消息都有一个唯一的 Offset。你可以把它理解成消息在日志文件里的“行号”。

Offset 从 0 开始,每条新消息的 Offset 递增 1。消费者读取消息时,需要告诉 Kafka 从哪个 Offset 开始读。

举个例子:

Partition 0 的消息:
Offset 0: 用户A点击了按钮
Offset 1: 用户B浏览了页面
Offset 2: 用户C提交了订单

消费者可以指定从 Offset 1 开始读,跳过前面的消息。这就是 Kafka 支持“回溯消费”的原因。

避坑指南:我曾经遇到过消费者提交 Offset 失败,导致重启后重复消费了几万条消息。后来改用手动提交 Offset,配合幂等性处理,才算彻底解决。

3.5 Producer——消息的生产者

Producer 负责把消息发送到指定的 Topic。它有几个关键行为:

  • 选择 Partition:可以指定 key,Kafka 根据 key 的哈希值决定发到哪个 Partition
  • 确认机制:acks 参数控制生产者等待多少个副本确认
  • 重试机制:发送失败时自动重试

我个人习惯把 acks 设为 all,虽然慢一点,但保证消息不丢。如果对吞吐要求极高,可以设为 1,但要做好丢消息的心理准备。

3.6 Consumer——消息的消费者

Consumer 从 Topic 拉取消息。它有几个重要概念:

  • Consumer Group:一组消费者共同消费一个 Topic,每个 Partition 只能被组内的一个消费者消费
  • Rebalance:当消费者加入或退出时,Partition 的分配会重新调整
  • Offset 管理:消费者需要记录自己消费到了哪个 Offset

你想想看,如果两个消费者在同一个 Group 里,它们会分摊 Partition。如果 Group 里只有一个消费者,那它就要消费所有 Partition。

经验之谈:Consumer Group 的消费者数量不要超过 Partition 数量,否则会有消费者闲置。我曾经犯过这个错,加了 10 个消费者,但 Topic 只有 6 个 Partition,结果 4 个消费者一直在空转。

3.7 它们之间的关系

说了这么多,咱们用一张图来总结一下:

Kafka 核心概念关系图 Kafka 核心概念关系图 Producer Broker 集群 Broker 1 Broker 2 Broker 3 Topic: user_behavior Partition 0 Partition 1 Partition 2 Offset: 0, 1, 2, 3, ... Consumer Group Consumer 1 Consumer 2 Consumer 3 写入 拉取 说明: Producer 将消息写入 Topic 的某个 Partition,Partition 内消息按 Offset 顺序排列。 Consumer Group 内的每个 Consumer 负责消费一个或多个 Partition,互不冲突。

3.8 核心概念速查表

最后,我整理了一个速查表,方便你随时回顾:

概念 一句话解释 我的建议
Broker Kafka 服务器节点 至少 3 个,避免单点故障
Topic 消息的逻辑分类 按业务类型划分,别混在一起
Partition 消息的物理存储单元 数量根据吞吐量预估,后期可扩展
Offset 消息在 Partition 内的编号 手动提交更可控,但要注意幂等性
Producer 消息的生产者 acks 设为 all,保证不丢消息
Consumer 消息的消费者 Group 内消费者数 ≤ Partition 数

嗯,这六个概念搞清楚了,Kafka 的基本架构你就掌握了八成。后面咱们会基于这些概念,一步步搭建行为流采集系统。