Skip to content

RabbitMQ 存储与高可用

本页结论:Classic Queue、Quorum Queue、Stream 是三种定位完全不同的队列类型;生产可靠性场景默认选 Quorum Queue,大积压/回放场景看 Stream,不要把三者混成一种队列。

存储模型

RabbitMQ 的消息存储挂在队列上:

  • 消息进入队列时位于内存;persistent 消息会尝试落盘(时机由 Broker 决定,不承诺同步刷盘)。
  • ACK 后消息即删除——没有 offset、没有回放。这是队列语义,与 Kafka 的日志语义形成根本区别。
  • 队列积压时消息更多驻留内存/磁盘分页,长积压会触发内存告警与流控(见 背压与积压)。

三种队列类型

类型定位复制适用
Classic Queue传统单副本队列(4.x 起镜像模式已弃用)无(节点级故障即不可用/可能丢消息)开发测试、可容忍丢失的临时数据
Quorum QueueRaft 多数派复制的持久化队列多数派确认才返回生产可靠消息的默认选择
Stream追加日志型队列,消费不删除多副本(replication factor)大积压、多消费组回溯重读

关键点:

  • Quorum Queue 写入需多数派(3 副本需 2 个节点存活)确认,延迟高于 Classic Queue,这是复制换可用性的必然代价。
  • Quorum Queue 强制持久化与至少一次语义,忽略部分 Classic 参数(如 per-message TTL 语义差异),迁移时须核对参数。
  • Stream 的消费模型接近日志:cursor 由消费者持有,消息按 retention 保留。它与 Classic/Quorum 是不同的 API 实体(x-queue-type=stream),不能按普通队列类比。
  • 本仓库实验统一使用 Classic Queue(最小依赖、行为直观);Quorum/Stream 只做原理讲解,不做容器内多节点演示(属于 L3 级别,默认不执行)。

高可用与故障语义

  • 少数派节点故障:自动切换 Leader,生产消费继续;未同步到多数派的在途消息可能丢或重排。
  • 失去多数派:队列不可用(宁停勿错),恢复多数派后继续。
  • Publisher Confirms 在 Quorum Queue 下表示多数派已接受——这正是「确认的含义取决于队列类型」的例子。

扩展

  • 队列是 Broker 上的实体:单个队列只在一个节点上「驻留」,扩展消费能力靠增加队列数与消费者数,而不是给一个队列加节点。
  • Sharded Queues(一致性哈希 Exchange)是常见分片模式。
  • 节点扩容/缩容影响的是队列分布与 rebalance,不是 Kafka 式的分区再分配。

常见误区

  • 「Quorum Queue 一定比 Classic 慢,所以别用」——多数派复制的延迟换的是「节点挂了消息还在」,生产消息系统几乎总是划算的。
  • 「Stream 就是更快版的队列」——消费不删除、cursor 语义、retention 策略都不同,用它之前先想清楚是否真的需要回放。
  • 「所有 RabbitMQ 队列都适合超长积压或日志回放」——这是规格 §7.1 的禁止表述:Classic/Quorum 是队列,超长积压与回放场景应评估 Stream 或日志型系统。

官方资料

以统一实验验证消息系统语义边界