RabbitMQ 路由、确认与恢复局部实验(U58)
公开入口,仓库根目录,JDK 21 / Maven 3.9 / Python 3;使用本机独立 RabbitMQ node(端口 5679),不触碰其他实例:
实验代码sh
python3 labs/rabbitmq-topology/run.py前置:RabbitMQ 4.4.0 发行包解压在仓库外缓存 ~/.cache/software-engineering-study/tools/rabbitmq_server-4.4.0(搭配 Homebrew Erlang 29.1.2)。缺失时脚本如实标记 broker=BLOCKED 并以非零退出,不降级为 mock。
入口启动独立 node(NODENAME=u58@localhost,mnesia/log 在临时目录),运行 11 个测试后停止 node。证据 evidence/u58-2026-10-28.json 记录版本、每条命令退出码、观察行与源文件哈希。
教材:RabbitMQ 路由、确认与恢复。公开工程:测试、broker 连接工厂、runner、POM、运行证据。Kafka 主课见MQ 生产存储消费可靠性,重试/死信方法论见重试、死信、延迟消息与积压。
| 测试 | 真实观察 |
|---|---|
| directExchangeRoutesByExactBindingKey | 精确路由键只投一个队列 |
| fanoutDeliversToEveryBoundQueue | fanout 广播到所有绑定队列 |
| topicExchangeMatchesWildcards | order.*.created 与 order.# 的匹配差异 |
| mandatoryUnroutableMessageIsReturned | 不可路由消息以 312 NO_ROUTE 被 return |
| publisherConfirmAcksPersistentMessage | persistent 消息 confirm ack |
| basicNackRequeuesAndRedeliveredFlagIsSet | nack+requeue 后 redelivered=true |
| prefetchLimitsUnackedDeliveries | basicQos(2) 未 ack 只投 2 条,ack 后补投 |
| deadLetterExchangeReceivesRejectedMessage | reject 不重回队列进入 DLX |
| unackedMessageReturnsToQueueAfterChannelClose | channel 关闭未 ack 消息回队列 |
| alternateExchangeReceivesUnroutableMessage | alternate-exchange 接收不可路由消息 |
| quorumQueueDeliversOnSingleNode | quorum 队列单节点声明与投递 |
边界
- 单节点 RabbitMQ;集群、quorum 多数派、跨节点恢复未运行。
- 未运行 TLS、SASL 外部认证、federation/shovel、stream 插件、优先级/惰性队列。
- broker 崩溃/断电恢复未运行;本实验只验证 channel 关闭与 nack 的重投。
- 只使用 127.0.0.1、临时 mnesia 目录与合成消息;结束时停止自己启动的 node。
已知未运行
集群与 quorum 多数派恢复、broker 崩溃恢复、TLS/外部认证、federation/shovel、stream 插件、优先级与惰性队列、多消费者公平分发专项均未运行。