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. 自检
- Topic/Partition/Consumer Group 各解决什么?
- 为什么"分区数=最大并行消费数"?
- 三种顺序级别?
- 再平衡的原因与代价?
- 拉模式为什么是主流?
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/ 评论
0 条
还没有评论,先写一条吧。