
kafka的消息模式 
kafka是一种 基于消费者组(Consumer Group)的分布式流处理模型,既支持“广播”,也支持“负载均衡”,但默认行为是 负载均衡(竞争消费)。
✅ Kafka 的两种主要消费模式 
1️⃣ 负载均衡模式(Competing Consumers)——默认模式 
- 多个消费者属于 同一个消费者组(Consumer Group)
- 它们共同消费一个 Topic 的消息
- 每条消息只会被组内的一个消费者消费(类似“队列”)
- 用于 横向扩展、提高吞吐量
📌 示例:
bash
# 消费者 A 和 B 属于同一个 group
bin\windows\kafka-console-consumer.bat --topic my-topic --bootstrap-server localhost:9092 --group my-group
bin\windows\kafka-console-consumer.bat --topic my-topic --bootstrap-server localhost:9092 --group my-group✅ 结果:
- 消息 1 → 消费者 A
- 消息 2 → 消费者 B
- 消息 3 → 消费者 A
- ……
👉 每条消息只被消费一次,A 和 B 竞争消费。
2️⃣ 广播模式(Broadcast)——通过不同消费者组实现 
- 多个消费者属于 不同的消费者组
- 每个组都会独立、完整地消费 Topic 的所有消息
- 实现“一条消息被多个客户端收到”
📌 示例:
bash
# 消费者 A 属于 group-a
bin\windows\kafka-console-consumer.bat --topic my-topic --bootstrap-server localhost:9092 --group group-a
# 消费者 B 属于 group-b(不同组!)
bin\windows\kafka-console-consumer.bat --topic my-topic --bootstrap-server localhost:9092 --group group-b✅ 结果:
- 消息 1 → A 收到,B 也收到
- 消息 2 → A 收到,B 也收到
- ……
👉 实现了广播:每个消费者组都收到全部消息。
📊 对比总结 
| 模式 | 消费者组 | 消息分发方式 | 类比 | 
|---|---|---|---|
| 负载均衡 | 同一个组 | 每条消息只被组内一个消费者消费 | 多个工人分拣快递(每人分几件) | 
| 广播 | 不同组 | 每个组都收到全部消息 | 所有工人都收到同一份通知 | 
✅ 回答你的问题 
“kafka集群,都是广播模式么?只有这一种模式?”
❌ 不是。Kafka 默认不是广播模式,而是负载均衡模式。
“其他客户端监听同一个topic,都可以收到消息?”
❌ 不一定!关键看 是否在同一个消费者组:
- ✅ 如果 消费者组不同 → 每个组都能收到全部消息(广播)
- ❌ 如果 消费者组相同 → 消息会被组内消费者“瓜分”(负载均衡)
🚀 如何实现“所有客户端都收到消息”? 
如果你想让 多个客户端都收到相同的消息(广播),你就需要:
👉 让每个客户端使用不同的 --group 名称。
例如:
bash
# 客户端1
--group client-1
# 客户端2
--group client-2
# 客户端3
--group client-3这样,三个客户端都会收到 my-topic 的全部消息。
💡 补充:如果不指定 --group? 
- Kafka 会自动生成一个随机的消费者组 ID。
- 每次启动都是不同的组,所以每次都会从头消费(--from-beginning效果)。
- 这种情况下,看起来像广播,但其实是“每个消费者都是独立组”。
✅ 总结 
| 问题 | 答案 | 
|---|---|
| Kafka 是广播模式吗? | ❌ 不是,默认是负载均衡 | 
| 所有客户端都能收到消息吗? | ❌ 只有不同消费者组才能收到全部消息 | 
| 如何实现广播? | 让每个消费者使用不同的 --group | 
| 如何实现竞争消费? | 多个消费者使用相同的 --group | 
Kafka 的这种设计非常灵活,既能做“消息队列”,也能做“事件广播”,是它强大之处 🚀
分区和消费者的关系 
✅ 在同一个消费者组(Consumer Group)中,一个分区(Partition)只能被一个消费者(Consumer)消费。
Kafka 的消费顺序和分配机制,不是按消息一条条“轮着来”或“抢着来”,而是基于 Topic 的分区(Partition) 来决定的。
🧩 核心机制:分区(Partition)是分配的最小单位 
- 一个 Topic 有多个 分区(Partitions)
- 每个分区内的消息是严格有序的
- 每个分区只能被同一个消费者组中的一个消费者消费
- 消费者组内的消费者会瓜分这些分区
📊 举个例子 
假设:
- Topic: my-topic
- 分区数: 3(Partition 0, 1, 2)
- 消费者组: my-group
- 启动 2 个消费者:Consumer A和Consumer B
Kafka 会进行 分区再平衡(Rebalance),可能分配如下:
| 分区 | 消费者 | 
|---|---|
| Partition 0 | Consumer A | 
| Partition 1 | Consumer B | 
| Partition 2 | Consumer A | 
注意:具体分配由 Kafka 的 分区分配策略(如 Range、RoundRobin、Sticky)决定。
✅ 消费行为 
- 所有发往 Partition 0 和 2 的消息 → 只由 A 消费
- 所有发往 Partition 1 的消息 → 只由 B 消费
- A 和 B 同时独立消费,互不干扰
🔄 细节 
- 消息在生产时就被分配到某个分区(默认轮询,或按 Key 哈希)
- 哪个消费者负责这个分区,就由谁消费
- 即使 A 很忙,B 很空闲,A 负责的分区也不会交给 B
🎯 举个实际例子 
生产者发送 6 条消息:
| 消息 | 分区 | 内容 | 
|---|---|---|
| M1 | 0 | Hello | 
| M2 | 1 | World | 
| M3 | 0 | Kafka | 
| M4 | 2 | is | 
| M5 | 1 | cool | 
| M6 | 2 | ! | 
消费者分配:
- A: P0, P2
- B: P1
消费顺序可能是:
Consumer A: Hello → Kafka → is → !
Consumer B: World → cool虽然 M2(World)在 M3(Kafka)之前发送,但因为它们在不同分区,所以 A 和 B 是并行消费的,整体顺序不保证。
✅ 如何保证顺序? 
| 需求 | 实现方式 | 
|---|---|
| 分区内有序 | 默认支持,无需配置 | 
| 全局有序(所有消息) | Topic 只能有 1 个分区,所有消息串行处理 | 
| 按 Key 有序 | 生产者使用 key,相同 key 的消息会进入同一分区,保证该 key 的消息有序 | 
🚨 注意:消费者数量 vs 分区数 
- 如果消费者数量 > 分区数:多余的消费者会空闲(没有分区可分配)
- 如果消费者数量 ≤ 分区数:可以充分利用并行消费
✅ 总结 
| 问题 | 答案 | 
|---|---|
| 消费是轮着来吗? | ❌ 不是,是基于分区分配 | 
| 谁快谁消费更多? | ❌ 不是,每个消费者固定负责某些分区 | 
| 消息是严格顺序的吗? | ✅ 分区内有序,❌ Topic 级别不保证全局有序 | 
| 如何实现负载均衡? | 多个分区 + 多个消费者,每个消费者处理一个或多个分区 | 
💡 记住一句话: 
“Kafka 的并行度 = 分区数”
消费者只能消费整个分区,不能“抢”单条消息。
这就是 Kafka 高吞吐、可扩展的核心设计 🚀

