恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
RabbitMQ 3.11.2 维护版本解析:镜像队列稳定性修复与 MQTT 维护模式行为修正
首页
资讯中心
/
RabbitMQ 3.11.2 维护版本解析:镜像队列稳定性修复与 MQTT 维护模式行为修正
RabbitMQ 3.11.2 维护版本解析:镜像队列稳定性修复与 MQTT 维护模式行为修正
发布时间:2026/9/23 1:20:32
RabbitMQ 3.11.2 维护版本解析镜像队列稳定性修复与 MQTT 维护模式行为修正【免费下载链接】rabbitmq-serverOpen source RabbitMQ: core server and tier 1 (built-in) plugins项目地址: https://gitcode.com/gh_mirrors/ra/rabbitmq-serverRabbitMQ3.11.2是3.11.x发布系列中的一个维护版本maintenance release主要面向经典镜像队列classic mirrored queue的稳定性与 MQTT 插件在维护模式maintenance mode下的行为修正。本文以 release-notes/3.11.2.md 为骨架结合当前仓库中deps/rabbit与deps/rabbitmq_mqtt的源码实现逐一拆解本版本的四个 Bug 修复背后的原理、影响范围与升级注意事项帮助集群运维者评估是否需要升级以及升级后的行为变化。版本定位与运行环境要求RabbitMQ3.11.2属于3.11.x系列核心特征是自 3.11.0 起将 Erlang 最低支持版本提升至 Erlang 25本版本延续这一要求运行在 Erlang 25 之下的节点将无法启动will fail to startErlang 25 作为新的基线为 ARM64 架构带来显著性能提升同时所有架构都能获得更完整的 profiling 能力如火焰图分析与最新的 TLS 1.3 实现支持若从 3.11.0 之前的版本升级需先查阅 v3.11.0 发布说明中的升级章节遵循对应的升级路径。也就是说评估本版本是否适合你的环境时第一优先级是确认所有节点的 Erlang 版本不低于 25否则升级后节点会直接拒绝启动。Core Server 修复详解本版本中核心服务器Core Server共包含三个 Bug 修复其中两个与经典镜像队列classic mirrored queueCMQ直接相关一个涉及集群内部通信链路的指标采集。回退不安全的节点间通信优化GitHub issue #6115现象与修复本版本部分回退partially reverts了一项此前引入的节点间通信优化对应 PR #3865该优化存在安全隐患可能影响经典镜像队列的操作顺序ordering。修复由社区成员 bording 提供了自动化复现方法后被确认并解决。源码侧的理解经典镜像队列依赖 leader 与 follower 之间的有序消息流来保证镜像一致性而节点间通信优化往往通过批量化、异步化的手段压缩往返开销一旦在 peer 恢复、消息积压等场景下打破原有顺序保证就会导致 follower 侧的操作顺序与 leader 不一致。从仓库中的镜像队列实现看leader 到 follower 的同步路径分散在 deps/rabbit/src/rabbit_amqqueue_process.erl队列进程状态机与 deps/rabbit/src/rabbit_classic_queue.erl经典队列 BQ 层中这类跨进程通信对顺序高度敏感因此回退该优化、恢复保守的通信路径是恢复操作顺序保证的稳妥做法。运维影响本修复属于行为回归修正升级后经典镜像队列在节点间通信路径上恢复为更保守的调度方式对使用经典镜像队列且重视严格顺序的存量用户建议优先升级到本版本。经典镜像队列 leader 过度授予 follower creditGitHub issue #6110现象与修复经典镜像队列的 leader 副本此前向 follower 副本授予了过多的 credit信用额度导致各 follower 之间的负载load与内存占用memory footprint不均——部分 follower 积压了超出预期的数据量而其他 follower 相对空闲。源码侧的理解credit 机制在 RabbitMQ 中用于背压backpressure控制本质是发送方只有在收到接收方授予的 credit 后才能继续投递消息从而限制在途in-flight数据量。经典镜像队列中leader 通过 deps/rabbit/src/rabbit_classic_queue.erl 的credit/6将{credit, self(), Ctag, DeliveryCountRcv, LinkCreditRcv, Drain}请求委托给队列进程rabbit_amqqueue_process队列进程侧则在 deps/rabbit/src/rabbit_amqqueue_process.erl 的handle_cast({credit, ...})中经由rabbit_queue_consumers:process_credit/6处理并调用rabbit_classic_queue:send_credit_reply/7见 deps/rabbit/src/rabbit_classic_queue.erl向消费方回发credit_reply。当授予的 credit 数量过大时follower 的在途数据缓冲就会膨胀从而出现负载与内存的不均衡。修复效果调整 leader 授予 follower 的 credit 额度使各副本在途数据量趋于均衡降低内存峰值与副本间的负载倾斜。集群通信链路指标收集器异常GitHub issue #6127现象与修复集群内部通信链路intra-cluster communication link的指标收集器metric collector在 peer 连接刚刚重建例如 peer 节点重启之后时可能抛出异常。原因与影响指标收集器通常依赖持续存活的进程引用或连接状态来读取统计信息当 peer 连接重建、旧进程退出而新进程尚未完成注册时收集器持有的引用可能短暂失效从而触发异常。该异常一般不影响数据面消息收发但会导致该轮指标采集失败、统计出现空缺或日志中出现异常信息。运维建议该修复属于健壮性增强升级后集群节点滚动重启过程中的指标采集将更稳定配合监控系统如 rabbitmq_prometheus使用时可减少统计缺口。MQTT 插件修复维护模式只应关闭本地连接GitHub issue #6108现象与修复此前当节点被置入维护模式maintenance mode时MQTT 插件会在整个集群范围内关闭所有 MQTT 客户端连接而预期行为是只关闭**本节点local**的客户端连接。本版本将其修正为仅关闭本地连接。源码侧的证据链这个修复在仓库中可以从三层代码完整还原维护模式的事件源节点进入 drain排空流程时核心服务器在关闭本地客户端连接之后会发出内部事件maintenance_connections_closed见 deps/rabbit/src/rabbit_maintenance.erlclose_all_client_connections/0之后rabbit_event:notify(maintenance_connections_closed, ...)。MQTT 插件的事件响应MQTT 插件通过 deps/rabbitmq_mqtt/src/rabbit_mqtt_internal_event_handler.erl 订阅该事件事件到达时调用rabbit_mqtt:close_local_client_connections(maintenance)并记录警告日志Closed ~b local (Web) MQTT client connections。“本地”的语义实现close_local_client_connections/1见 deps/rabbitmq_mqtt/src/rabbit_mqtt.erl通过pg进程组作用域枚举pg:get_local_members/2得到本节点的 MQTT 连接进程列表再逐一对每个进程调用rabbit_mqtt_reader:close_connection/2。由于获取的是 local members天然不会波及集群其他节点上的 MQTT 连接。关闭时的客户端通知rabbit_mqtt_reader在收到{close_connection, Reason}消息时见 deps/rabbitmq_mqtt/src/rabbit_mqtt_reader.erl若Reason : maintenance会先通过rabbit_mqtt_processor:send_disconnect(?RC_SERVER_SHUTTING_DOWN, PState)向客户端发送 MQTT DISCONNECT 报文原因码Server shutting down随后以{shutdown, {disconnect, server_initiated}}正常终止连接——这保证了被维护的节点上的 MQTT 客户端能收到明确的断开原因而不是静默断连。运维影响在维护节点、执行滚动升级时集群其他节点上的 MQTT 客户端含 Web MQTT将不再被误伤断连提升滚动维护期间 MQTT 业务的连续性。依赖升级与源码归档依赖升级Dependency Upgrades本版本无任何依赖升级None in this release因此升级的兼容面更小主要风险集中在上述行为修复上。源码归档Source Code Archives获取完整发行版源码时请下载名为rabbitmq-server-3.11.2.tar.xz的归档包不要使用 GitHub 自动生成的源码 tarball后者可能不包含完整构建环境所需的文件。升级评估清单综合本版本内容建议运维者在升级前对照以下清单Erlang 版本所有节点必须运行 Erlang 25 及以上否则节点拒绝启动经典镜像队列本版本涉及顺序保证回归修复与 credit 均衡修复若业务依赖经典镜像队列的顺序性与多副本内存均衡建议升级MQTT 插件若启用rabbitmq_mqtt或rabbitmq_web_mqtt且频繁执行节点维护如滚动升级、Kubernetes preStop 排空本版本的“仅关闭本地连接”修复能显著减少对客户端的影响滚动升级方式从 3.11.0 之前版本升级的用户需按 v3.11.0 升级说明执行3.11.x 系列内的小版本升级仍遵循标准的节点逐个排空drain—升级—恢复revive流程其中 drain 流程见 deps/rabbit/src/rabbit_maintenance.erl。总结RabbitMQ 3.11.2 是一个聚焦稳定性的小版本核心服务器围绕经典镜像队列修复了节点间通信顺序隐患与 credit 授予失衡问题并增强了集群链路指标采集的健壮性MQTT 插件则修正了维护模式下误关全集群连接的行为使其严格限定在本节点范围。结合仓库源码可见这些修复分别落在 deps/rabbit/src/rabbit_amqqueue_process.erl、deps/rabbit/src/rabbit_classic_queue.erl、deps/rabbit/src/rabbit_maintenance.erl 以及 deps/rabbitmq_mqtt/src/rabbit_mqtt.erl 等模块中读者可沿着这些路径继续深入阅读对应实现。对于运行经典镜像队列或大规模 MQTT 接入的集群本版本值得纳入升级计划。【免费下载链接】rabbitmq-serverOpen source RabbitMQ: core server and tier 1 (built-in) plugins项目地址: https://gitcode.com/gh_mirrors/ra/rabbitmq-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考