Kafka 核心概念:Topic、Partition、Broker、Producer、Consumer、Consumer Group

说实话,Kafka 的这几个核心概念,是理解整个消息系统的基石。我刚开始接触 Kafka 时,也花了不少时间才把它们之间的关系理清楚。今天咱们就一个一个掰开揉碎了讲。

1. Topic(主题)—— 数据的分类标签

Topic 说白了就是一个数据流的名字。你往 Kafka 里写数据,必须指定一个 Topic;读数据,也得指定一个 Topic。它就像数据库里的表,或者文件系统里的文件夹。

举个例子,我在做电商项目时,会创建 order_topic、payment_topic、user_action_topic 三个 Topic。订单服务往 order_topic 写数据,支付服务读 payment_topic,各司其职。

关键点:Topic 只是一个逻辑概念,真正的数据存储和读写,是在 Partition 层面完成的。

2. Partition(分区)—— 真正的数据容器

每个 Topic 可以分成多个 Partition。Partition 才是真正存数据的地方。为什么要分区?说白了就是为了并行和扩展。

  • 并行读写:一个 Topic 有 3 个 Partition,就可以被 3 个 Consumer 同时消费,吞吐量直接翻 3 倍。
  • 数据有序:每个 Partition 内部的消息是有序的,但不同 Partition 之间不保证顺序。
  • 分布式存储:Partition 可以分布在不同的 Broker 上,实现水平扩展。

我记得有一次,线上 Topic 只有一个 Partition,消费速度跟不上生产速度。我加到了 6 个 Partition,消费端也开了 6 个线程,问题立马解决了。嗯,这里要注意:Partition 数一旦确定,只能增加不能减少,所以前期规划很重要。

3. Broker(代理节点)—— Kafka 服务器

Broker 就是运行 Kafka 服务的机器。一个 Kafka 集群由多个 Broker 组成。每个 Broker 会管理一部分 Partition 的数据。

概念 类比 说明
Broker 数据库服务器 运行 Kafka 进程的机器
Topic 数据库中的表 数据的逻辑分类
Partition 表的分区 实际存储数据的单元

你想想看,如果集群有 3 个 Broker,一个 Topic 有 6 个 Partition,Kafka 会自动把 Partition 均匀分配到 3 个 Broker 上。这样即使一台 Broker 挂了,数据也不会全部丢失。

4. Producer(生产者)—— 数据的写入者

Producer 负责把消息发送到 Topic。我个人的习惯是,生产端一定要关注三个参数:

  • acks:确认机制。设为 all 最安全,但性能最差;设为 1 是折中方案。
  • retries:重试次数。网络抖动时很有用,但要注意幂等性。
  • batch.size:批量大小。适当调大能提升吞吐量。
// 一个典型的生产者配置
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 3);
props.put("batch.size", 16384);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("my-topic", "key", "value"));

小技巧:生产端最好开启幂等性(enable.idempotence=true),这样即使重试也不会产生重复消息。我曾经因为这个配置没开,导致下游消费到了重复数据,排查了半天。

5. Consumer(消费者)—— 数据的读取者

Consumer 从 Topic 拉取数据。注意,是 Consumer 主动去 Broker 拉,不是 Broker 推给 Consumer。这种拉模式的好处是,Consumer 可以根据自己的处理能力来控制消费速度。

Consumer 需要关注的核心概念是 offset(偏移量)。每个 Partition 里的消息都有一个唯一的 offset,Consumer 通过记录 offset 来知道自己消费到了哪里。

6. Consumer Group(消费者组)—— 消费的负载均衡

这是 Kafka 最巧妙的设计之一。多个 Consumer 可以组成一个 Group,共同消费一个 Topic。Kafka 会保证每个 Partition 只被同一个 Group 内的一个 Consumer 消费。

为什么会这样?你想想看,如果两个 Consumer 同时消费同一个 Partition,那消息就重复了。如果某个 Partition 没人消费,那数据就漏掉了。Consumer Group 机制完美解决了这个问题。

避坑指南:我曾经犯过一个错误——同一个 Group 下的 Consumer 数量超过了 Partition 数量。结果多余的 Consumer 一直空闲,白白浪费资源。记住:Consumer 数不要超过 Partition 数,否则多出来的 Consumer 会一直 idle。

7. 核心关系一览

这几个概念之间的关系,我用一张图来总结:

Kafka 核心概念关系图 Producer Kafka Cluster Broker 1 Broker 2 Topic Partition 0 Partition 1 Partition 2 Consumer Group Consumer 1 Consumer 2 Consumer 3 写入 消费 消费 消费 说明: Producer 写入 Topic Topic 分为多个 Partition Partition 分布在 Broker 上 Consumer Group 消费数据

8. 总结一下

这几个概念串起来就是一条完整的数据链路:

  1. Producer 把消息发到 Topic
  2. Topic 把消息分配到某个 Partition
  3. Partition 存储在某个 Broker 上
  4. Consumer Group 里的 Consumer 从 Partition 拉取消息
  5. 每个 Partition 只被 Group 内的一个 Consumer 消费

说白了,Kafka 就是用 Partition 实现了并行,用 Consumer Group 实现了负载均衡。理解了这个核心逻辑,后面再学什么副本机制、ISR、Leader 选举,都会轻松很多。