862 字
约 2 分钟
10
S17-J01 · 消息模型:Topic / 分区 / 消费组

适用读者:用 MQ 只会 send/consume 的人。
前置:S17-B05。
覆盖旧文:2390(794) 166(75) 167(108) 169(63) 170(63) 171(73) + Kafka 四卡 + RocketMQ 四卡 = 3,672 点。
覆盖扩展:E-S17-004(分区与顺序)、E-S17-005(再平衡)。
上一篇:S17-B05 · 配置中心与热更新
下一篇:S17-J02 · MQ 选型。


1. 一句话结论

MQ 的三个概念解决三件事:Topic 分类、分区并发、消费组负载均衡。核心约束只有一条——顺序只在"同一分区内"成立。

Topic(订单事件)
 ├── Partition 0: m1 → m3 → m5   ← 同分区有序
 ├── Partition 1: m2 → m4
 └── 消费组 A:每个分区只被组内一个消费者消费

2. 三个概念的分工

概念 解决 注意
Topic 逻辑分类 不同业务用不同 Topic
Partition 并行度与顺序 分区数 = 最大并行消费数
Consumer Group 负载均衡 组内互斥、组间广播

"为什么分区数不能随便改":Kafka 增加分区会破坏 key 到分区的映射 → 同一业务键的消息可能落到别的分区 → 顺序失效。


3. 顺序的三层含义(E-S17-004)

级别 怎么保证
全局有序 只有单分区单消费者(吞吐极低)
分区有序 同一 key(如订单号)路由到同一分区
无序 默认(多分区并行)

判据:"这类消息必须按顺序处理吗?" 必须 → 用业务键做分区键,并接受"该 key 串行"。

"分区有序 ≠ 全局有序"——这是最常被误解的一条。


4. 再平衡(E-S17-005)

触发:消费者加入/离开、分区数变化、订阅变化。

影响 说明
短暂停止消费 默认 Stop-the-world(Kafka 有增量协同协议缓解)
可能重复消费 位点未提交 → 重新投递(J03)

"再平衡频繁怎么办":调大 session.timeout/max.poll.interval、避免长耗时处理、用静态成员(Kafka 2.3+)。


5. 推 vs 拉

模式 说明
拉(Kafka/RocketMQ 主流) 消费者控制节奏,易做背压
推 实时性好,但消费者易被打爆

"推模式其实是"长轮询"——broker 有数据才返回,本质仍是拉。


6. 五个误区

误区 真相
"MQ 保证全局有序" 只在分区内有序
"分区越多越好" 增加再平衡与资源开销
"消费组内每个消费者都收到" 组内互斥(队列语义)
"加分区不影响业务" 会破坏 key 路由 → 顺序失效
"拉模式延迟高" 长轮询接近实时

7. 自检

  1. Topic/Partition/Consumer Group 各解决什么?
  2. 为什么"分区数=最大并行消费数"?
  3. 三种顺序级别?
  4. 再平衡的原因与代价?
  5. 拉模式为什么是主流?

8. 下一篇

S17-J02 · MQ 选型:RabbitMQ / Kafka / RocketMQ

模型讲完,下一篇做选型:三者到底各适合什么。


本篇属于系列《S17 · 分布式与消息队列》。旧文来源:A-2390/166/167/169/170/171 + Kafka/RocketMQ 八卡;扩展点 E-S17-004/005。

S17-J01 · 消息模型:Topic / 分区 / 消费组
https://www.clxhxhhr.top/posts/5424/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。