Kafka 核心概念:Topic、Partition、Broker、Producer、Consumer、Consumer Group
好,咱们正式开始啃 Kafka 的核心概念。说实话,很多初学者一上来就被这些术语搞懵了。Topic 是什么?Partition 又是什么?Broker 是干嘛的?
别急,我带你一个一个拆开看。搞懂了这些,Kafka 的骨架你就抓住了。
1. Topic:消息的逻辑分类
Topic 是 Kafka 里最基础的概念。说白了,它就是消息的“类别”或“主题”。
你想想看,一个系统里会有各种消息:订单消息、支付消息、日志消息……如果全混在一起,谁分得清?Topic 就是用来做分类的。生产者往 Topic 里写,消费者从 Topic 里读。
核心要点:Topic 只是一个逻辑概念,数据并不真的存在 Topic 里。数据存在 Partition 里。
我个人习惯用业务名称来命名 Topic,比如 order_events、payment_notifications。这样一看就知道是干什么的。
2. Partition:真正的数据载体
Partition 才是 Kafka 真正存数据的地方。一个 Topic 可以拆成多个 Partition,每个 Partition 是一个有序的、不可变的日志文件。
为什么要拆?为了并行。你想想,如果只有一个 Partition,那读写都挤在一条道上,性能肯定上不去。拆成多个,就能分散到不同的机器上,读写也能并行。
我的经验:Partition 数量不是越多越好。太多会导致文件句柄暴增,反而拖慢性能。我一般建议 Partition 数不超过 Broker 数的 10 倍。
每个 Partition 里的消息都有一个唯一的偏移量(Offset),从 0 开始递增。消费者就是靠这个 Offset 来定位消息的。
3. Broker:Kafka 的服务器节点
Broker 就是运行 Kafka 服务的机器。一个 Kafka 集群由多个 Broker 组成。
每个 Broker 会管理一部分 Partition。比如你有 3 个 Broker,一个 Topic 有 6 个 Partition,那每个 Broker 大概管 2 个。
注意:Broker 挂了怎么办?Kafka 有副本机制。每个 Partition 可以设置副本数,副本分布在不同的 Broker 上。一个 Broker 挂了,其他 Broker 上的副本还能顶上。
我曾经遇到过 Broker 磁盘写满的情况,结果整个 Partition 都不可写了。后来我养成了习惯:给每个 Broker 挂独立的磁盘,并且监控磁盘使用率。
4. Producer:消息的生产者
Producer 就是往 Kafka 发消息的客户端。它负责把消息发送到指定的 Topic。
Producer 有几个关键点:
- 分区策略:消息发到哪个 Partition?可以轮询、按 Key 哈希、或者自定义策略。
- 确认机制:acks 参数控制消息的可靠性。acks=0 不等待确认,最快但可能丢数据;acks=all 等所有副本确认,最安全但慢。
- 重试机制:发送失败会自动重试,但要注意幂等性,防止重复消息。
避坑指南:我曾经在生产环境把 acks 设成 0,结果 Broker 重启时丢了一批订单消息。从那以后,核心业务我至少用 acks=1。
5. Consumer:消息的消费者
Consumer 从 Kafka 拉取消息。它主动去 Broker 上拉,而不是 Broker 推给它。
为什么是拉?因为推的话,Broker 不知道消费者处理能力,容易把消费者压垮。拉的话,消费者自己控制节奏,处理完一批再拉下一批。
Consumer 需要记录自己消费到了哪个 Offset。如果 Consumer 重启了,就从上次的 Offset 继续消费,不会重复也不会漏掉。
我的建议:Offset 提交要谨慎。自动提交虽然方便,但可能丢数据。我一般用手动提交,确保业务处理完再提交 Offset。
6. Consumer Group:消费者的逻辑分组
Consumer Group 是 Kafka 实现“广播”和“单播”的关键。
同一个 Group 里的消费者,共同消费一个 Topic 的消息。每条消息只会被 Group 里的一个消费者处理。这就是“单播”。
不同 Group 的消费者,各自独立消费。每条消息可以被多个 Group 消费。这就是“广播”。
举个例子:订单 Topic 有 3 个 Partition。一个 Group 里有 3 个消费者,每个消费者负责一个 Partition。如果 Group 里只有 2 个消费者,那其中一个消费者要负责 2 个 Partition。
注意:消费者数量不要超过 Partition 数。多出来的消费者会闲置,白白浪费资源。
7. 核心关系一览
我把这些概念的关系整理成了一张图,你看一眼就明白了:
8. 概念对比表
最后,我用一张表帮你快速对比这几个核心概念:
| 概念 | 角色 | 关键点 | 常见误区 |
|---|---|---|---|
| Topic | 消息分类 | 逻辑概念,不存数据 | 以为 Topic 就是存储单元 |
| Partition | 数据存储 | 有序日志,支持并行 | Partition 越多越好 |
| Broker | 服务器节点 | 管理 Partition,支持副本 | Broker 挂了数据就丢了 |
| Producer | 消息发送者 | 分区策略、确认机制 | acks=0 最安全 |
| Consumer | 消息接收者 | 拉模式、Offset 管理 | 自动提交万无一失 |
| Consumer Group | 消费者分组 | 单播与广播 | 消费者越多消费越快 |
嗯,这些概念你搞清楚了,Kafka 的骨架就搭起来了。后面咱们再聊怎么用这些概念搭一个可靠的消息驱动任务调度系统。