RabbitMQ 4.3.0 发布:Khepri 成为唯一元数据存储,Quorum 队列多项增强
RabbitMQ 官方发布 4.3.0 版本。这是一个新功能版本,最重要的变化是 Khepri 成为唯一受支持的元数据存储(Mnesia 被完全移除),以及 Quorum 队列的大量增强(严格优先级、延迟重试、消费者超时等)。同时,经典队列 v1 存储(CQv1)被移除、多项弃用功能默认禁用。本文基于 RabbitMQ 官方发布说明,系统解读 4.3.0 的破坏性变更、新特性和升级注意事项。
破坏性变更与兼容性说明
Mnesia 和分区处理策略被移除
- 只有 4.2.x 集群可以原地升级到 4.3.0,对绝大多数安装这不是破坏性变更
- 但会影响使用 Mnesia 的社区插件
- rabbitmq.conf 中所有分区处理相关键仍会被接受但不生效:
- cluster_partition_handling
- cluster_partition_handling.pause_if_all_down.recover
- cluster_partition_handling.pause_if_all_down.nodes.$name
- 官方建议升级前或升级后不久移除上述键
弃用功能默认禁用
多项弃用功能现在默认禁用,需要用户主动选择开启:
- 非持久(transient)非独占队列:默认拒绝声明这种属性组合的队列
- 替代方案:持久队列、临时独占队列、或带队列 TTL 的持久队列
- 显式允许:所有集群节点设置 rabbitmq.conf 键并重启,且需在集群升级到 4.3.0 之前在所有节点生效:
deprecated_features.permit.transient_nonexcl_queues = true
经典队列 v1 存储(CQv1)被移除
- 移除原始经典队列存储实现(现称 CQv1)
- 第二代实现 CQv2 自 4.2.0 起成为默认
- 以下队列参数将失败:x-queue-mode 设为任意值、x-queue-version 设为 1
- 之前在升级到 4.2.x 时迁移到 CQv2 的现有经典队列继续正常运作
消费者超时不再对经典队列和流评估
- 消费者超时处理责任转移到队列本身
- 除流协议外,所有协议现在对支持的队列类型评估消费者超时
- 经典队列和流从不评估消费者超时,因为其用例大多不需要该功能
发布亮点
Khepri 成为唯一元数据存储
- 本版本中 Khepri 是 RabbitMQ 唯一受支持的元数据存储
- Mnesia 被完全移除
- 实际操作含义:
- 集群要可用,多数节点必须始终在线
- 故障和分区恢复显著更简单和统一
- 所有具有复制状态的组件(Khepri、quorum 队列、流)按 Raft 恢复语义恢复
Quorum 队列增强
- 升级 Ra 依赖到 3.x
- 引入 quorum 队列状态机的第 8 个版本,包含多项新特性和优化:
- 严格优先级队列:按优先级统计消息数、正确的重投递顺序、优先级感知的消息过期
- 延迟重试:消息返回时可配置递增退避
- 消费者超时:未确认消息的可配置超时,AMQP 1.0 和 MQTT 有协议特定处理
- 恢复快照和快照节流:减少恢复时间、改进快照决策
- 内存优化:紧凑消息引用、延迟键的优化元组存储、移除 rabbit_fifo_index 使用
升级到 4.3.0
升级路径
- 本版本系列支持从 4.2.x 升级
- 不支持从更早系列升级:必须先升级到最新的 4.2.x 补丁版本再升级到 4.3.0
- 混合版本集群兼容:4.3.0 节点可以与 4.2.x 在同一集群运行(仅用于滚动升级,不应长时间运行)
新必需功能标志
4.2.0 及更早引入的所有功能标志都是必需的,包括:
- rabbitmq_4.2.0、rabbitmq_4.1.0、rabbitmq_4.0.0
- khepri_db、quorum_queue_non_voters、message_containers_deaths_v2
升级到 4.3.0 前启用所有必需功能标志。如果集群在 RabbitMQ 3.13.x 启用了 rabbitmq_amqp1_0 插件(且 4.x 中仍服务 AMQP 1.0 客户端连接),应在启用 rabbitmq_4.0.0 功能标志后、升级到 4.3.0 前至少做一次滚动更新。
弃用功能状态
以下功能的弃用阶段从 permitted_by_default 推进到 denied_by_default:
- amqp_address_v1
- amqp_filter_set_bug
- global_qos
- queue_master_locator
- transient_nonexcl_queues
弃用功能 ram_node_type 已被移除。
值得注意的变更
核心服务器增强
- 消息被队列拒绝时,RabbitMQ 现在在 Rejected outcome 中向 AMQP 1.0 发布者提供队列名和拒绝原因。多个队列绑定到同一交换机时特别有用:发布者可以识别具体哪个队列拒绝了消息及原因(如达到最大队列长度或队列不可用)。队列名和原因包含在 Rejected outcome 错误字段的 info 中:queue: 、reason: maxlen | unavailable
- Quorum 队列支持严格优先级队列(按优先级计数、跨优先级正确重投递顺序、优先级感知过期扫描)
- Quorum 队列支持延迟重试,基于投递次数可配置退避;消息被返回(reject、nack、modify)时可以保持在延迟状态
总结
RabbitMQ 4.3.0 是一个重要的新功能版本,核心变化是 Khepri 成为唯一元数据存储(Mnesia 完全移除),使故障和分区恢复更简单统一——所有复制状态组件按 Raft 恢复语义恢复,但要求集群多数节点始终在线。Quorum 队列获得多项增强:严格优先级队列(按优先级计数、正确重投递顺序、优先级感知过期)、延迟重试(可配置递增退避)、消费者超时(AMQP 1.0/MQTT 协议特定处理)、恢复快照和快照节流、内存优化。破坏性变更包括:CQv1 存储移除(x-queue-mode/x-queue-version=1 参数将失败)、弃用功能默认禁用(如 transient 非独占队列需显式允许)、分区处理键不再生效。升级注意事项:仅 4.2.x 支持原地升级、需先启用所有必需功能标志、AMQP 1.0 用户需注意滚动更新要求。对运维的影响:4.3.0 简化了集群故障处理模型,同时通过默认禁用弃用功能推动最佳实践落地,升级前需要审查配置和插件兼容性。
来源:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v4.3.0