KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
RabbitMQ 工程课 · 课程导读 — keel 龙骨
RabbitMQ 工程课:路由、确认与死信 的参考信息:RabbitMQ 工程课 · 课程导读
你现在的起点
- 会
basic_publish/basic_consume,也配过durable=True和delivery_mode=2,但说不清「消息到底丢在哪一步」; - 用过 direct 和 fanout,对 topic 的
*/#只是「大概知道是通配符」; - 听过 quorum queue、死信队列、镜像队列,但把它们当成配置项,没弄清各自的失败语义;
- 出过「队列堆积把内存撑满、broker 把 publisher 卡死」这种事,或者还没出过但怕它来。
如果上面有几条对上,这门课就是为你写的。
一条能走通的学习路径
AMQP 模型全景(一条消息在 broker 里经过了哪些对象,边界在哪)
→ 路由实测(四种 exchange 各收到什么,通配符的边界在哪)
→ 上行可靠性(publish 静默丢失的三段,各自补哪一段)
→ 下行可靠性(ack / nack / requeue / prefetch 的真实语义)
→ 死信与延迟(x-death 长什么样,延迟队列的三种做法)
→ 集群与队列类型(classic 与 quorum 的取舍,Raft 语义)
→ 流控与运维(内存告警怎么变成背压,该盯哪些指标)
七章共用一套拓扑:vhost /lab,交换机 lab.ex.direct / lab.ex.topic / lab.ex.fanout / lab.ex.headers / lab.ex.dlx,队列 lab.dl.main / lab.dlq / lab.quorum.q / lab.persist.q。每一章都在上一章的对象上加一块,不重新发明例子。
章节地图
| 章 | 关键问题 | 你会亲手验证什么 |
|---|---|---|
| 00 · AMQP 模型全景 | 一条 publish 到 consume 的链路里,connection / channel / vhost / exchange / queue / binding 各管什么边界 | 一个 TCP 连接上开 3 个 channel,在 list_connections 看到 channels 3、关掉一个变成 2;并撞上 4.x 拒绝非持久非独占队列的真实报错 |
| 01 · 路由实测 | direct / topic / fanout / headers 四种 exchange 的匹配规则差在哪,topic 的 * 与 # 边界在哪 |
同一批 routing key 分别投给四种 exchange,打印每个队列实际收到的消息;验证 a.*.c 不匹配 a.c、a.# 匹配 a.c |
| 02 · 上行可靠性 | publish 什么时候会静默丢失,confirm / mandatory / alternate exchange / 持久化各补哪一段 | mandatory=True 下拿回 basic.return;reject-publish 造出真实 basic.nack;重启 broker 看 delivery_mode=2 与 =1 的存活差异 |
| 03 · 下行可靠性 | ack / nack / requeue / prefetch 的语义,慢消费者为什么会把队列拖垮 | 一个慢消费者加一个快消费者,对比不设 prefetch 与 prefetch_count=1 时两者各消费多少条 |
| 04 · 死信与延迟 | x-death 的真实结构是什么,延迟队列有几种做法、代价各是什么 |
让消息被 nack(requeue=False) 与 TTL 到期进死信队列,把 x-death 六个字段完整打出来 |
| 05 · 集群与队列类型 | classic 与 quorum 差在哪,Raft 语义下什么算多数派、脑裂怎么收场 | list_queues name type 看到两种类型,rabbitmq-queues quorum_status 看到 raft 成员与 leader;并如实标注单节点跑不出选主 |
| 06 · 流控与运维 | 内存/磁盘告警怎么变成对 publisher 的背压,积压时先看什么 | 把水位调到 0.0001 造出告警,看 list_connections 的 state: blocked 与客户端被卡住,再改回 0.4 |
学完这门课你能做什么
- 对一条「消息没到」的故障,按 exchange → binding → queue → 消费者四段定位,而不是先重启 broker;
- 为路由结构选对 exchange 类型,并说清 topic 通配符写错时会丢哪一类 key;
- 配出一套「发了有确认、收错进死信、重启不丢」的链路,并知道每一段各自不保证什么;
- 判断一个队列该用 classic 还是 quorum,说清单节点上哪些结论无法验证、只能引用官方规定;
- 读懂
list_queues/list_connections/status里和容量、背压相关的字段,在堆积变成事故前看到苗头。
前置要求
- 会一门有 AMQP 0-9-1 客户端库的语言(本课实验用 Python 的
pika),能读懂basic_publish/basic_consume; - 建议先读 《可扩展性》05 章 · 消息队列——那章讲清了「什么时候该引入 MQ」和「至少一次投递为什么要求幂等」,本课直接从它停下的地方往下走;
- 实验台需要 RabbitMQ 4.x(本课输出出自 4.3.6)。4.0 移除了 classic 镜像队列,如果你用的是 3.x,第 05 章的结论要按 3.x 文档重新核对。
↓ 下一步:00 章 · AMQP 模型全景