资讯 RabbitMQ 4.3.0 发布:Khepri 成为唯一元数据存储,Quorum 队列多项增强

2026-09-07 04:09:05

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

复制全文 生成海报 RabbitMQ 消息队列 Khepri Quorum 4.3.0 Raft 发布

推荐文章

程序员茄子在线接单