Files
cs-note/hhs/MQ/README.md
T
2026-05-24 20:51:06 +08:00

295 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [MQ, 消息队列, 索引]
create time: 2026-05-24 19:52
---
# 消息队列(Message Queue)
## 概述
消息队列是分布式系统中最核心的中间件之一,用于解耦、削峰、异步通信。本目录从基础概念出发,逐层深入到协议标准、存储引擎、设计模式、流处理集成、消息追踪、K8s 部署、测试策略、安全运维与架构实战,构建完整的 MQ 知识体系。
## 知识地图
```mermaid
graph TD
A["消息队列"] --> B["基础概念"]
A --> C["消息模型"]
A --> D["协议与标准"]
A --> E["存储引擎"]
A --> F["可靠性保障"]
A --> G["高级特性"]
A --> H["主流 MQ 对比"]
A --> I["消息设计模式"]
A --> J["流处理与事件驱动"]
A --> K["监控与运维"]
A --> L["安全与多租户"]
A --> M["架构与实战"]
B --> B1["什么是 MQ"]
B --> B2["核心术语"]
B --> B3["适用场景与选型原则"]
C --> C1["队列模型 vs 发布订阅模型"]
C --> C2["Consumer Group 与 Rebalance"]
C --> C3["Push vs Pull"]
D --> D1["AMQP 协议"]
D --> D2["MQTT 协议"]
D --> D3["JMS 与 OpenMessaging"]
E --> E1["Kafka 存储设计"]
E --> E2["RocketMQ CommitLog"]
E --> E3["RabbitMQ 消息存储"]
F --> F1["消息确认与持久化"]
F --> F2["Exactly-Once 语义"]
F --> F3["消息幂等性"]
F --> F4["顺序性保障"]
F --> F5["死信队列与消息回溯"]
G --> G1["延迟消息与定时消息"]
G --> G2["事务消息"]
G --> G3["消息过滤与路由"]
G --> G4["Schema 管理与演进"]
G --> G5["消息压缩与批处理"]
H --> H1["Kafka"]
H --> H2["RabbitMQ"]
H --> H3["RocketMQ"]
H --> H4["Pulsar"]
H --> H5["NATS / NSQ / Redis Streams"]
H --> H6["选型对比"]
I --> I1["Competing Consumers"]
I --> I2["CQRS 与 Event Sourcing"]
I --> I3["Claim Check 与消息瘦身"]
I --> I4["背压与流控"]
I --> I5["请求-回复模式"]
J --> J1["Kafka Streams"]
J --> J2["流处理框架集成"]
J --> J3["事件驱动架构"]
J --> J4["MQ 与 CDC"]
K --> K1["监控指标与告警"]
K --> K2["消费积压治理"]
K --> K3["消息轨迹与链路追踪"]
K --> K4["容器化与 K8s 部署"]
K --> K5["性能调优"]
K --> K6["测试策略"]
L --> L1["认证与授权"]
L --> L2["加密与审计"]
M --> M1["高可用架构"]
M --> M2["跨集群复制与容灾"]
M --> M3["分布式事务实践"]
M --> M4["MQ 与微服务"]
M --> M5["客户端 SDK 最佳实践"]
M --> M6["客户端连接管理"]
M --> M7["MQ 设计与实现"]
style A fill:#4A90D9,color:#fff
style B fill:#6EC1E0,color:#fff
style C fill:#6EC1E0,color:#fff
style D fill:#6EC1E0,color:#fff
style E fill:#F5A623,color:#fff
style F fill:#F5A623,color:#fff
style G fill:#F5A623,color:#fff
style H fill:#D0021B,color:#fff
style I fill:#D0021B,color:#fff
style J fill:#D0021B,color:#fff
style K fill:#D0021B,color:#fff
style L fill:#D0021B,color:#fff
style M fill:#D0021B,color:#fff
```
---
## 目录
### 一、基础概念
由浅入深,先搞清楚 MQ 是什么、为什么需要它。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 1 | [[01-基础概念/1-MQ-基础概念|MQ 基础概念]] | 什么是消息队列、核心术语(Producer / Broker / Consumer / Topic / Queue)、为什么需要 MQ |
| 2 | [[01-基础概念/2-MQ-适用场景与选型原则|MQ 适用场景与选型原则]] | 解耦、异步、削峰三大经典场景;何时该用 MQ,何时不该用 |
### 二、消息模型
理解消息如何从生产者流向消费者。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 3 | [[02-消息模型/3-MQ-消息模型|MQ 消息模型]] | 队列模型 vs 发布订阅模型、Consumer Group 机制、推模式 vs 拉模式 |
### 三、协议与标准
了解底层通信协议,才能理解不同 MQ 的设计取舍。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 4 | [[03-协议与标准/4-MQ-消息协议总览|MQ 消息协议总览]] | AMQP / MQTT / STOMP / JMS / OpenMessaging 横向对比与适用场景 |
| 5 | [[03-协议与标准/5-AMQP-协议|AMQP 协议]] | AMQP 0-9-1 核心概念(Exchange / Binding / Virtual Host)、AMQP 1.0 与 0-9-1 的差异 |
| 6 | [[03-协议与标准/6-MQTT-协议|MQTT 协议]] | IoT 场景下的轻量级协议、QoS 等级(0/1/2)、遗嘱消息、会话保持 |
| 7 | [[03-协议与标准/7-JMS-与-OpenMessaging|JMS 与 OpenMessaging]] | Java 消息服务规范、点对点与发布订阅接口、OpenMessaging 标准化尝试 |
### 四、存储引擎
消息如何落地存储,决定了 MQ 的吞吐与可靠性上限。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 8 | [[04-存储引擎/8-MQ-存储引擎设计|MQ 存储引擎设计]] | 顺序写盘、零拷贝、Page Cache、内存映射等通用高性能存储原理 |
| 9 | [[04-存储引擎/9-Kafka-存储设计|Kafka 存储设计]] | Partition Log 分段存储、稀疏索引、日志压缩(Log Compaction)、时间轮(Timing Wheel) |
| 10 | [[04-存储引擎/10-RocketMQ-CommitLog|RocketMQ CommitLog]] | CommitLog + ConsumeQueue + IndexFile 三层存储模型、MappedFile 内存映射 |
| 11 | [[04-存储引擎/11-RabbitMQ-消息存储|RabbitMQ 消息存储]] | Erlang Mnesia 表、持久化队列(durable / lazy queue)、内存告警与流控 |
### 五、可靠性保障
消息不能丢、不能重复、最好还能保序——生产环境的核心诉求。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 12 | [[05-可靠性保障/12-MQ-消息确认与持久化|MQ 消息确认与持久化]] | ACK 机制、同步/异步刷盘、主从同步、消息投递语义(At-Most-Once / At-Least-Once / Exactly-Once) |
| 13 | [[05-可靠性保障/13-MQ-Exactly-Once-语义|MQ Exactly-Once 语义]] | 幂等生产者、事务性生产者、Consumer 端幂等消费、Exactly-Once 的边界与代价 |
| 14 | [[05-可靠性保障/14-MQ-消息幂等性|MQ 消息幂等性]] | 为什么会产生重复消息、幂等实现方案(唯一 ID + 去重表、乐观锁、Token 机制) |
| 15 | [[05-可靠性保障/15-MQ-顺序性保障|MQ 顺序性保障]] | 全局有序 vs 分区有序、Partition/Queue 级别的有序实现、多消费者场景下的顺序挑战 |
| 16 | [[05-可靠性保障/16-MQ-死信队列与消息回溯|MQ 死信队列与消息回溯]] | 死信队列的产生原因与处理策略、消息重试机制、消息回溯(按时间/偏移量重放) |
### 六、高级特性
MQ 在复杂业务场景下提供的进阶能力。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 17 | [[06-高级特性/17-MQ-延迟消息与定时消息|MQ 延迟消息与定时消息]] | 延迟级别、定时投递的实现原理(时间轮、定时任务)、典型应用(订单超时取消) |
| 18 | [[06-高级特性/18-MQ-事务消息|MQ 事务消息]] | 半消息机制、事务状态回查、分布式事务的最终一致性方案 |
| 19 | [[06-高级特性/19-MQ-消息过滤与路由|MQ 消息过滤与路由]] | Tag / SQL 表达式过滤、Topic 路由策略、消息 Schema 演进 |
| 20 | [[06-高级特性/20-MQ-Schema-管理与演进|MQ Schema 管理与演进]] | Schema Registry、Avro/Protobuf/Thrift 编码、前向/后向/完全兼容性策略 |
| 21 | [[06-高级特性/21-MQ-消息压缩与批处理|MQ 消息压缩与批处理]] | Snappy / LZ4 / Zstd 压缩算法对比、批量发送与拉取策略、压缩对吞吐的影响 |
### 七、主流 MQ 对比
了解主流产品的设计差异,才能做出合理的技术选型。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 22 | [[07-主流MQ对比/22-Kafka|Kafka]] | 架构设计(Partition / Replica / ISR)、高吞吐原理(零拷贝、顺序写、批量拉取)、Kafka 生态 |
| 23 | [[07-主流MQ对比/23-RabbitMQ|RabbitMQ]] | AMQP 协议、Exchange 类型(Direct / Fanout / Topic / Headers)、插件生态 |
| 24 | [[07-主流MQ对比/24-RocketMQ|RocketMQ]] | NameServer / Broker / Producer / Consumer 架构、事务消息原生支持、延迟消息实现 |
| 25 | [[07-主流MQ对比/25-Apache-Pulsar|Apache Pulsar]] | 计算存储分离架构、Segment 存储(BookKeeper)、多租户原生支持、与 Kafka 的架构对比 |
| 26 | [[07-主流MQ对比/26-NATS-NSQ-Redis-Streams|NATS / NSQ / Redis Streams]] | NATS JetStream、NSQ 无中心架构、Redis Streams 底层 Radix Tree、轻量级场景选型 |
| 27 | [[07-主流MQ对比/27-MQ-选型对比|MQ 选型对比]] | Kafka vs RabbitMQ vs RocketMQ vs Pulsar vs NATS 多维度对比(吞吐、延迟、可靠性、生态、运维) |
### 八、消息设计模式
用好 MQ 不只是选产品,更需要掌握经过验证的架构模式。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 28 | [[08-消息设计模式/28-MQ-Competing-Consumers-模式|MQ Competing Consumers 模式]] | 多消费者竞争消费、负载均衡策略、分区分配算法(Range / Round-Robin / Sticky / Cooperative) |
| 29 | [[08-消息设计模式/29-MQ-CQRS-与-Event-Sourcing|MQ CQRS 与 Event Sourcing]] | 命令查询分离、事件作为数据源、事件存储与重放、与传统 CRUD 的对比 |
| 30 | [[08-消息设计模式/30-MQ-Claim-Check-与消息瘦身|MQ Claim Check 与消息瘦身]] | 大消息拆分存储、消息体外置到对象存储、按需拉取减少网络开销 |
| 31 | [[08-消息设计模式/31-MQ-背压与流控|MQ 背压与流控]] | 生产速率超过消费能力时的保护机制、Broker 端流控、Consumer 端反压、限流降级策略 |
| 32 | [[08-消息设计模式/32-MQ-请求-回复模式|MQ 请求-回复模式]] | RPC over MQ、关联 ID(CorrelationID)、Reply-To 队列、与 gRPC/HTTP 调用的对比取舍 |
### 九、流处理与事件驱动
MQ 不只是"传消息",更是实时数据流的基础设施。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 33 | [[09-流处理与事件驱动/33-MQ-与流处理|MQ 与流处理]] | 消息队列 vs 流处理平台的区别与融合、Kafka Streams / Flink / Spark Streaming 集成 |
| 34 | [[09-流处理与事件驱动/34-事件驱动架构-EDA|事件驱动架构 EDA]] | 事件风暴(Event Storming)、事件编排 vs 事件编排(Orchestration vs Choreography)、Saga 模式 |
| 35 | [[09-流处理与事件驱动/35-MQ-与-CDC|MQ 与 CDC]] | Change Data Capture 原理、Debezium + Kafka Connect、数据库变更实时同步方案 |
### 十、监控与运维
线上 MQ 出问题,如何快速发现、定位与修复。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 36 | [[10-监控与运维/36-MQ-监控指标与告警|MQ 监控指标与告警]] | Broker / Producer / Consumer 核心指标、Prometheus + Grafana 看板搭建、告警阈值设计 |
| 37 | [[10-监控与运维/37-MQ-消费积压治理|MQ 消费积压治理]] | 积压根因分析、紧急扩容消费者、临时队列转发、监控告警策略 |
| 38 | [[10-监控与运维/38-MQ-消息轨迹与链路追踪|MQ 消息轨迹与链路追踪]] | 消息唯一标识(TraceID)传递规范、端到端链路可视化、消息审计日志、排查"消息去哪了" |
| 39 | [[10-监控与运维/39-MQ-容器化与-K8s-部署|MQ 容器化与 K8s 部署]] | K8s Operator(Strimzi / RocketMQ Operator)、Helm Chart 部署、StatefulSet 有状态服务管理、资源规划与持久卷 |
| 40 | [[10-监控与运维/40-MQ-性能调优|MQ 性能调优]] | Producer 批量与压缩、Consumer 并发与预取、Broker 刷盘与页缓存策略、网络参数优化 |
| 41 | [[10-监控与运维/41-MQ-测试策略|MQ 测试策略]] | 集成测试(Testcontainers)、影子流量(Shadow Topic)、故障注入(Chaos Engineering)、消息契约测试(Pact) |
### 十一、安全与多租户
生产环境不可或缺的安全基础设施。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 42 | [[11-安全与多租户/42-MQ-认证与授权|MQ 认证与授权]] | SASL / mTLS / OAuth2 认证机制、ACL 细粒度授权、Kerberos 集成 |
| 43 | [[11-安全与多租户/43-MQ-加密与审计|MQ 加密与审计]] | 传输加密(TLS)、消息级加密、审计日志、配额管理与多租户隔离 |
### 十二、架构与实战
面向真实生产环境的问题与解决方案。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 44 | [[12-架构与实战/44-MQ-高可用架构|MQ 高可用架构]] | Broker 集群与副本机制、无单点设计、灰度发布 |
| 45 | [[12-架构与实战/45-MQ-跨集群复制与容灾|MQ 跨集群复制与容灾]] | MirrorMaker 2.0、Confluent Replicator、Dledger 多副本、跨地域同步、异地多活架构 |
| 46 | [[12-架构与实战/46-MQ-分布式事务实践|MQ 分布式事务实践]] | 本地消息表 + MQ、事务消息 + 状态回查、Saga 模式与 MQ 结合 |
| 47 | [[12-架构与实战/47-MQ-与微服务|MQ 与微服务]] | 服务间通信模式(同步 vs 异步)、事件驱动微服务、服务网格(Istio/Linkerd)与 MQ 集成、背压传播 |
| 48 | [[12-架构与实战/48-MQ-客户端-SDK-最佳实践|MQ 客户端 SDK 最佳实践]] | 多语言 SDK 设计范式、连接池管理、优雅关闭(Graceful Shutdown)、序列化策略、错误处理规范 |
| 49 | [[12-架构与实战/49-MQ-客户端连接管理|MQ 客户端连接管理]] | 长连接与心跳、重连与重试策略、分区分配策略(Consumer Rebalance)、客户端容错 |
| 50 | [[12-架构与实战/50-MQ-设计与实现|MQ 设计与实现]] | 从零设计一个简易 MQ:存储引擎、网络模型、消费者管理、高可用方案 |
### 附录:云消息服务
了解云厂商托管方案,拓宽技术视野。
| 序号 | 主题 | 说明 |
|:---:|------|------|
| 51 | [[13-云消息服务/51-云消息服务|云消息服务]] | AWS SQS / SNS / MSK、Azure Service Bus、Google Pub/Sub、阿里云 RocketMQ 与 Kafka、自建 vs 托管对比 |
---
## 学习路径建议
```mermaid
graph LR
S1["1 基础概念"] --> S2["2 消息模型"]
S2 --> S3["3 协议与标准"]
S3 --> S4["4 存储引擎"]
S4 --> S5["5 可靠性保障"]
S5 --> S6["6 高级特性"]
S6 --> S7["7 主流 MQ"]
S7 --> S8["8 设计模式"]
S8 --> S9["9 流处理与 EDA"]
S9 --> S10["10 监控运维"]
S10 --> S11["11 安全"]
S11 --> S12["12 架构实战"]
style S1 fill:#6EC1E0,color:#fff
style S2 fill:#6EC1E0,color:#fff
style S3 fill:#6EC1E0,color:#fff
style S4 fill:#F5A623,color:#fff
style S5 fill:#F5A623,color:#fff
style S6 fill:#F5A623,color:#fff
style S7 fill:#D0021B,color:#fff
style S8 fill:#D0021B,color:#fff
style S9 fill:#D0021B,color:#fff
style S10 fill:#D0021B,color:#fff
style S11 fill:#D0021B,color:#fff
style S12 fill:#D0021B,color:#fff
```
> [!tip] 建议
> - **初学者**:按 1 → 2 → 3 → 5 顺序阅读,打牢基础后再进入存储引擎和高级特性。
> - **有经验者**:可直接跳到 7(主流 MQ)和 8(设计模式),以问题驱动学习。
> - **架构师**:重点关注 8 设计模式、9 流处理、10 监控运维、12 架构实战四个模块。
> - 每篇笔记都包含思考题,建议先独立思考再看解答。
## 关联笔记
- [[分布式系统]]