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

好,咱们正式开始啃Kafka的核心概念。说实话,很多初学者一上来就被这些术语搞懵了。我当年刚接触Kafka时,也是对着文档看了半天,脑子里全是问号。今天我用最直白的方式,把这些概念给你讲透。

1. Topic(主题)—— 消息的分类标签

Topic说白了就是一个消息的类别。你想想看,一个系统里会有各种消息:订单消息、支付消息、用户登录消息……如果全混在一起,那不乱套了?

Topic就是用来做分类的。生产者往Topic里发消息,消费者从Topic里读消息。每个Topic都有一个名字,比如order_topicpayment_topic

核心要点:Topic是逻辑上的概念,它不存储数据,只是告诉Kafka「这类消息该走哪条道」。

2. Partition(分区)—— 真正的存储单元

这里有个关键点:Topic其实是个虚的,真正干活的是Partition。

每个Topic会被分成多个Partition。每个Partition就是一个有序的、不可变的消息序列。消息追加到Partition尾部,每个消息都有一个唯一的偏移量(Offset)。

我在项目中遇到过一个问题:有个同事把Topic只设了1个Partition,结果消费者处理不过来,消息堆积严重。后来改成8个Partition,吞吐量直接翻了8倍。

我的建议:Partition数量一般设置为Broker数量的整数倍。比如3台Broker,可以设6个或9个Partition。别设太多,否则管理成本会上升。

3. Broker(代理节点)—— Kafka集群的成员

Broker就是运行Kafka服务的机器。一个Kafka集群由多个Broker组成。每个Broker可以管理多个Partition。

Broker之间通过ZooKeeper(新版本用KRaft)协调。比如某个Broker挂了,其他Broker会接管它管理的Partition。

嗯,这里要注意:Broker是无状态的。它不保存消费者的消费进度,消费进度由消费者自己提交到Kafka内部Topic(__consumer_offsets)里。

4. Producer(生产者)—— 消息的发送者

Producer负责把消息发到Topic。它可以选择发到哪个Partition。默认情况下,如果消息没有指定Key,就轮询发送;如果指定了Key,就根据Key的哈希值决定Partition。

我曾经踩过一个坑:生产者的acks参数设成了0,结果消息丢了都不知道。后来改成acks=all,虽然慢了点,但数据安全多了。

// 生产者配置示例
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", "all");  // 等待所有副本确认
props.put("retries", 3);   // 重试次数

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

Consumer从Topic拉取消息。注意,是「拉」不是「推」。Kafka采用拉模式,消费者主动去Broker拉数据。这样做的好处是消费者可以控制消费速度,不会把消费者压垮。

每个Consumer可以订阅一个或多个Topic。它从Partition里读取消息,并记录自己读到了哪个Offset。

6. Consumer Group(消费者组)—— 消费者的组织

这是Kafka最巧妙的设计之一。多个Consumer可以组成一个Group。同一个Group里的Consumer共同消费一个Topic的消息。

规则很简单:一个Partition只能被同一个Group里的一个Consumer消费。但不同Group可以独立消费同一个Partition。

举个例子:假设Topic有4个Partition,你的Group里有3个Consumer。那么3个Consumer会各分到1个Partition,剩下的1个Partition会分配给其中一个Consumer(负载均衡)。

避坑指南:我曾经遇到过Consumer Group里Consumer数量超过Partition数量的情况。多出来的Consumer会闲置,不干活。所以Consumer数量最好小于等于Partition数量。

7. Offset(偏移量)—— 消息的坐标

Offset是消息在Partition里的位置编号。每个消息在Partition里都有一个唯一的Offset,从0开始递增。

消费者通过Offset知道自己该从哪里开始读。比如上次读到Offset 100,下次就从101开始读。

Offset的提交方式有两种:

  • 自动提交:默认每5秒提交一次。简单但可能重复消费。
  • 手动提交:业务处理完再提交。更安全,但代码复杂些。

我建议金融场景用手动提交。毕竟钱的事,不能丢也不能重复。

知识体系总览

下面这张图把核心概念的关系画清楚了:

Kafka核心概念关系图 Producer 消息生产者 发送消息 Topic(主题) 逻辑分类 包含多个Partition Partition 0 Offset 0~99 Partition 1 Offset 0~99 Partition 2 Offset 0~99 Broker 集群 3台服务器 管理 Consumer Group 消费者组 一个Partition只被一个Consumer消费 Consumer 1 Consumer 2 Consumer 3 消费 消费 消费 Offset 消息的唯一编号

核心概念速查表

概念 一句话解释 我踩过的坑
Topic 消息的分类标签 命名不规范,后来维护时找不到对应业务
Partition 真正的存储单元,有序消息序列 Partition太少导致消费性能瓶颈
Broker Kafka服务器节点 Broker宕机后Partition Leader选举延迟
Producer 消息发送者 acks=0丢消息,血的教训
Consumer 消息读取者 消费速度跟不上生产速度,导致堆积
Consumer Group 消费者的组织,实现负载均衡 Consumer数量超过Partition,浪费资源
Offset 消息在Partition里的位置编号 自动提交导致重复消费,后来改手动提交

好了,这七个核心概念就是Kafka的基石。你把这些搞明白了,后面的内容学起来会轻松很多。记住一句话:Topic是逻辑分类,Partition是物理存储,Broker是运行节点,Producer和Consumer是两端角色,Consumer Group实现水平扩展,Offset保证消费位置。

我的学习建议:别光看,动手搭个单机Kafka环境,用命令行创建Topic、发消息、消费消息。亲手操作一遍,比看十遍文档都管用。

专注资料整理