Skip to content
鼓励作者:欢迎打赏犒劳

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)是分配的最小单位

  1. 一个 Topic 有多个 分区(Partitions)
  2. 每个分区内的消息是严格有序
  3. 每个分区只能被同一个消费者组中的一个消费者消费
  4. 消费者组内的消费者会瓜分这些分区

📊 举个例子

假设:

  • Topic: my-topic
  • 分区数: 3(Partition 0, 1, 2)
  • 消费者组: my-group
  • 启动 2 个消费者:Consumer AConsumer B

Kafka 会进行 分区再平衡(Rebalance),可能分配如下:

分区消费者
Partition 0Consumer A
Partition 1Consumer B
Partition 2Consumer A

注意:具体分配由 Kafka 的 分区分配策略(如 Range、RoundRobin、Sticky)决定。


✅ 消费行为

  • 所有发往 Partition 0 和 2 的消息 → 只由 A 消费
  • 所有发往 Partition 1 的消息 → 只由 B 消费
  • A 和 B 同时独立消费,互不干扰

🔄 细节

  • 消息在生产时就被分配到某个分区(默认轮询,或按 Key 哈希)
  • 哪个消费者负责这个分区,就由谁消费
  • 即使 A 很忙,B 很空闲,A 负责的分区也不会交给 B

🎯 举个实际例子

生产者发送 6 条消息:

消息分区内容
M10Hello
M21World
M30Kafka
M42is
M51cool
M62!

消费者分配:

  • 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 高吞吐、可扩展的核心设计 🚀

如有转载或 CV 的请标注本站原文地址