4. Kafka 核心概念:Producer、Consumer、Broker、Topic、Partition、Offset
好,咱们进入正题。Kafka 这东西,说白了就是一个「超级快递站」。你想想看,数据从 A 点送到 B 点,中间要经过哪些环节?谁发货?谁收货?货架怎么摆?包裹怎么编号?
这一章,我就带你把这六个核心概念彻底捋清楚。我当年刚接触 Kafka 时,被 Topic 和 Partition 的关系绕晕过好几次。嗯,后来踩了坑才明白,这些概念其实特别直观。
4.1 整体架构:一张图看懂
先看这张图,把六个概念串起来。我习惯先看整体,再抠细节。
这张图我画了好几次才满意。你看,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 等所有副本确认
// 一个简单的 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 的写法
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 同时消费。分区越多,吞吐量越高。
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 的基石。你把这六个搞明白了,后面讲生产消费、分区策略、副本机制,就顺理成章了。我当年就是先啃下这六个概念,后面学起来才没卡壳。