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

好,咱们进入正题。Kafka 这东西,说白了就是一个「超级快递站」。你想想看,数据从 A 点送到 B 点,中间要经过哪些环节?谁发货?谁收货?货架怎么摆?包裹怎么编号?

这一章,我就带你把这六个核心概念彻底捋清楚。我当年刚接触 Kafka 时,被 Topic 和 Partition 的关系绕晕过好几次。嗯,后来踩了坑才明白,这些概念其实特别直观。

4.1 整体架构:一张图看懂

先看这张图,把六个概念串起来。我习惯先看整体,再抠细节。

Kafka 核心概念架构图 Kafka 核心概念关系图 Producer 生产者 发送消息 Broker 集群 Broker 1 Broker 2 Broker 3 Topic: order_events P-0 P-1 P-2 … 每个 Partition 内 Offset 从 0 递增 Consumer 消费者 拉取消息 Consumer Group 核心流程一句话 ① Producer 将消息发送到 Broker 集群中的某个 Topic ② Topic 被切分为多个 Partition,分布在不同的 Broker 上 ③ 每条消息在 Partition 内获得唯一的 Offset(偏移量) ④ Consumer 从 Broker 拉取消息,按 Offset 顺序消费 ⑤ 多个 Consumer 可以组成 Group,协同消费同一个 Topic ⑥ Broker 负责存储、复制、管理所有消息

这张图我画了好几次才满意。你看,Producer 在左边发消息,Broker 在中间存消息,Consumer 在右边取消息。Topic 和 Partition 是 Broker 内部的组织方式,Offset 是消息的编号。就这么简单。

4.2 Producer:消息的「发货人」

Producer 就是生产消息的一方。我习惯把它想象成一个快递员——他负责把包裹(消息)送到快递站(Broker)。

Producer 有几个关键行为:

  • 指定 Topic:每条消息必须告诉 Kafka 发到哪个 Topic
  • 选择 Partition:可以指定分区,也可以让 Kafka 轮询或按 key 哈希
  • 确认机制:acks=0 不等待确认,acks=1 等 leader 确认,acks=all 等所有副本确认
我的经验: 生产环境中,我一般用 acks=1。性能和数据安全之间取个平衡。曾经有个项目为了极致性能设了 acks=0,结果网络抖动丢了一批订单数据,排查了一整天才发现是这里的问题。
// 一个简单的 Producer 示例
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "1");

Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("order_events", "order-123", "{\"userId\": 1001}"));
producer.close();

4.3 Consumer:消息的「收货人」

Consumer 负责从 Broker 拉取消息。注意,是「拉」不是「推」。Kafka 的设计哲学就是 Consumer 主动拉,这样 Consumer 可以根据自己的处理能力控制速度。

Consumer 的核心机制:

  • 拉取模型:Consumer 定期向 Broker 发起 fetch 请求
  • Offset 管理:消费到哪里了?Consumer 自己维护 Offset
  • Consumer Group:多个 Consumer 可以组成一个组,协同消费
注意: 我曾经遇到过一个坑——Consumer 处理消息时抛异常了,但 Offset 已经提交了。结果消息丢了,业务对不上账。后来我改成了手动提交 Offset,处理成功再提交,才彻底解决。
// Consumer 手动提交 Offset 的写法
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "order-group");
props.put("enable.auto.commit", "false");  // 手动提交
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("order_events"));

while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        // 处理业务逻辑
        System.out.println("处理消息: " + record.value());
    }
    consumer.commitSync();  // 处理完再提交
}

4.4 Broker:消息的「快递站」

Broker 就是 Kafka 服务器节点。一个 Kafka 集群由多个 Broker 组成。每个 Broker 可以管理多个 Partition。

Broker 的职责:

  • 存储消息:消息持久化到磁盘,不是内存
  • 副本管理:每个 Partition 可以有多个副本,分布在不同的 Broker 上
  • Leader 选举:某个 Broker 挂了,其他 Broker 上的副本会顶上
Broker 配置 说明 我的建议
broker.id 每个 Broker 的唯一标识 从 0 开始,不要重复
log.dirs 消息日志存储路径 用多块磁盘,分开目录
num.partitions Topic 默认分区数 根据吞吐量预估,一般 3~6 个
default.replication.factor 默认副本数 生产环境至少 2,推荐 3

4.5 Topic 与 Partition:消息的「货架」

Topic 是消息的逻辑分类。比如订单消息放 order_events,支付消息放 payment_events。每个 Topic 可以切分成多个 Partition。

Partition 是物理上的存储单元。每个 Partition 是一个有序的、不可变的消息序列。新消息追加到末尾。

为什么要分区?说白了就是为了并行。一个 Partition 只能被一个 Consumer 消费,但多个 Partition 可以被多个 Consumer 同时消费。分区越多,吞吐量越高。

关键点: Partition 内的消息是有序的,但 Topic 整体不保证有序。如果你需要全局有序,只能用一个 Partition——但那样吞吐量就上不去了。这是典型的 trade-off。

4.6 Offset:消息的「快递单号」

Offset 是 Partition 内每条消息的唯一编号。从 0 开始,递增,不会重复。

Consumer 通过 Offset 知道自己消费到哪里了。比如 Offset=100,说明已经消费了前 100 条,下一条是第 101 条。

Offset 的几种提交方式:

  • 自动提交:每隔一段时间自动提交,可能丢消息
  • 手动同步提交:处理完一批消息后调用 commitSync(),阻塞等待
  • 手动异步提交:调用 commitAsync(),不阻塞,但可能重复消费
我的习惯: 核心业务用手动同步提交,非核心业务用自动提交。异步提交我基本不用——回调处理起来太麻烦,而且重复消费的概率比想象中大。

4.7 六个概念的关系总结

最后,我用一个表格把这六个概念串起来。你对照着看,应该就清楚了。

概念 一句话解释 类比
Producer 发送消息的一方 快递员
Consumer 接收消息的一方 收件人
Broker Kafka 服务器节点 快递站
Topic 消息的逻辑分类 货架上的标签
Partition Topic 的物理分片 货架上的格子
Offset Partition 内消息的编号 快递单号

嗯,这六个概念是 Kafka 的基石。你把这六个搞明白了,后面讲生产消费、分区策略、副本机制,就顺理成章了。我当年就是先啃下这六个概念,后面学起来才没卡壳。