- 后端
- 消息队列
- 消息路由
【免费下载链接】rabbitmq-server
Open source RabbitMQ: core server and tier 1 (built-in) plugins
RabbitMQ3.10.10是3.10.x系列的一个维护版本(maintenance release),聚焦于修复经典镜像队列(classic mirrored queues)与 MQTT 插件在特定场景下的缺陷,并同步更新了 Erlang 运行时版本要求。本文以 release-notes/3.10.10.md 为核心,结合仓库源码逐一剖析每一项修复背后的实现细节、影响范围与升级注意事项,帮助读者在升级或排查问题时快速定位。
版本定位与升级前提
3.10.10属于3.10.x发布系列,属于维护版本,不带新增功能,主要目的是修复缺陷。如果从3.10.0之前的版本升级,请先参考 v3.10.0 release notes 中的升级章节(upgrade section),按步骤完成过渡升级,不能直接跨版本跳级。
本版本的另一个关键信息是 Erlang 运行时要求:
- 最低支持版本:Erlang 23 已到达其支持终点(end of support),因此本版本要求Erlang 24.2 或更高版本;
- 启动硬约束:在更老版本的 Erlang 上,节点将无法启动(Nodes will fail to start),这不是警告而是硬性失败;
- 推荐版本:Erlang 25,原因有三:
- 在 ARM64 架构上性能提升明显;
- 支持各架构下的火焰图(flame graphs)性能剖析;
- 包含最新的 TLS 1.3 实现。
更详细的版本对应关系,可参考仓库中的 docs/COMPATIBILITY.md 与 docs/compatibility.json。
核心服务器修复
部分回滚不安全的节点间通信优化
问题背景:本次修复部分回滚了一项被判定为不安全的节点间通信优化(原优化见 PR #3865 对应的优化逻辑),该优化可能影响经典镜像队列的操作顺序(operation ordering),进而破坏队列语义。
社区贡献:感谢 @bording 提供了可自动复现该问题的工具链,使得问题得以定位并验证修复效果。
当前实现佐证:经典镜像队列的节点间协调依赖rabbit_mirror_queue_misc等模块(参见 deps/rabbit/src/rabbit_mirror_queue_misc.erl),队列进程之间的消息投递与确认通过delegate:invoke_no_result/2等机制进行(见 deps/rabbit/src/rabbit_classic_queue.erl)。回滚该优化后,节点间通信恢复到更保守的顺序保证,代价是部分场景下的吞吐优化被放弃,换取镜像队列操作的确定性。
对运维的影响:正在使用经典镜像队列(policy 中ha-mode: exactly等镜像策略)的环境,建议尽快升级到本版本,以避免潜在的乱序风险。
经典镜像队列 Leader 过度发放 Credit 导致负载不均
问题背景:经典镜像队列的 Leader 副本向 Follower 副本发放了过多的 credit(信用额度),导致各副本之间的负载和内存占用不均——部分副本收到的消息量远大于其他副本,造成热点。
Credit 机制在源码中的体现:经典队列的 credit 流控贯穿rabbit_channel与队列进程之间的信用协商:
- 通道通过
credit/6接口向队列进程发送{credit, self(), Ctag, DeliveryCountRcv, LinkCreditRcv, Drain}请求(见 deps/rabbit/src/rabbit_classic_queue.erl); - 队列进程在投递消息时通过
credit_flow:send(QPid)进行信用计数(见 deps/rabbit/src/rabbit_classic_queue.erl); - 处理完 credit 请求后,通过
send_credit_reply/7返回#credit_reply{ctag, delivery_count, credit, avail, drain}结构(见 deps/rabbit/src/rabbit_classic_queue.erl)。
本次修复调整了 Leader 向 Follower 发放 credit 的额度策略,使消息在各副本间更均匀地分布,从而均衡内存占用与 CPU 负载。对于多节点、高吞吐镜像队列集群,这一修复能直接缓解"单副本内存暴涨"的告警场景。
集群内通信链路指标采集器异常修复
问题背景:当对端节点重启、集群内部 peer 连接刚刚重建(re-established)时,intra-cluster communication link 的指标采集器可能抛出异常,导致相关指标缺失或采集任务中断。
影响场景:滚动升级、单节点重启、网络分区恢复后,集群内节点间连接会频繁重建,此时如果指标采集器异常,监控面板上的链路指标(如 inter-node link 的发送/接收字节数)会出现空洞。
修复效果:本次修复让指标采集器在 peer 连接重建的竞态窗口内也能安全运行,不再抛出异常,保证 Prometheus 等监控数据连续可靠。
MQTT 插件修复
维护模式下错误地关闭了集群范围的全部 MQTT 连接
问题背景:当节点进入维护模式(maintenance mode)时,本应只关闭本节点本地的 MQTT 客户端连接,但修复前的实现错误地关闭了集群范围内所有节点的 MQTT 客户端连接,导致维护一个节点时,其他健康节点上的 MQTT 客户端也被强制断开,影响面远超预期。
源码实现佐证:修复后的实现位于 MQTT 插件的内部事件处理器中(deps/rabbitmq_mqtt/src/rabbit_mqtt_internal_event_handler.erl):
handle_event({event, maintenance_connections_closed, _Info, _, _}, ?STATE) -> {ok, NConnections} = rabbit_mqtt:close_local_client_connections(maintenance), ?LOG_WARNING("Closed ~b local (Web) MQTT client connections", [NConnections]), {ok, ?STATE};关键点在于close_local_client_connections/1——从函数命名和调用语义可以看出,它只处理本地节点维护的客户端连接,并返回关闭数量NConnections用于日志告警。这正是对"cluster-wide 误关闭"缺陷的针对性修复:事件在各节点本地触发,各节点只关闭自己维护的连接。
事件触发链路:该事件由rabbit_maintenance在节点进入维护模式(drain)时通过rabbit_event:notify(maintenance_connections_closed, ...)广播(见 deps/rabbit/src/rabbit_maintenance.erl),同时会先关闭本地 AMQP 客户端连接并挂起所有监听器。MQTT 插件的事件处理器订阅该事件后,仅对本节点的 MQTT 连接执行关闭,从而避免波及集群其他节点。
连接关闭的底层行为:本地连接关闭由rabbit_mqtt_reader的close_connection/2触发(见 deps/rabbitmq_mqtt/src/rabbit_mqtt_reader.erl),对maintenance这一关闭原因,读者进程会向客户端发送 MQTT 断开包,断开码为?RC_SERVER_SHUTTING_DOWN(0x8B,Server shutting down,见 deps/rabbitmq_mqtt/src/rabbit_mqtt_reader.erl),随后以{shutdown, {disconnect, server_initiated}}停止进程。这样 MQTT 客户端收到明确的服务端关闭原因,可以按 MQTT 规范进行优雅重连(配合clean session语义由客户端自行决策)。
运维建议:对使用 MQTT 插件的集群执行维护操作(如滚动升级、节点隔离)时,升级到3.10.10后,维护模式只会影响被维护节点上的 MQTT 连接,集群其他节点的 MQTT 客户端保持在线,业务中断面大幅缩小。
依赖升级
本版本没有依赖升级(Dependency Upgrades: None in this release),因此升级带来的回归风险主要来自上述代码修复本身,依赖层面的兼容性无需额外评估。
获取完整源码
要获取整个发行版的源代码,请下载名为rabbitmq-server-3.10.10.tar.xz的归档文件,而不要使用 GitHub 自动生成的源码 tarball——前者包含完整的构建依赖与子模块(如deps/下的全部插件),后者可能因子模块引用不完整而导致构建失败。
升级检查清单
| 检查项 | 要求 |
|---|---|
| Erlang 版本 | ≥ 24.2,推荐 25(ARM64 性能、火焰图、最新 TLS 1.3) |
| 跨版本升级 | 从 3.10.0 之前版本升级时,先完成过渡版本升级 |
| 经典镜像队列 | 修复 credit 发放与节点间通信顺序问题,建议升级 |
| MQTT 插件 | 修复维护模式误关集群连接,维护操作影响面更可控 |
| 依赖 | 无变化,无需额外兼容性验证 |
总结
3.10.10虽然是一个小版本维护发布,但其中两项修复对生产环境价值明显:一是经典镜像队列在节点间通信顺序与 credit 发放上的稳定性修复,直接关系到镜像队列的数据一致性与负载均衡;二是 MQTT 插件在维护模式下"误伤"整个集群连接的缺陷修复,让维护操作真正实现"局部可控"。配合 Erlang 24.2 的最低版本门槛,建议所有使用镜像队列或 MQTT 插件的3.10.x用户尽快规划升级,并参照 release-notes 目录下的其他版本说明制定升级路径。
RabbitMQ 3.10.10 维护版发布解析:经典镜像队列、MQTT 维护模式修复与 Erlang 版本要求
RabbitMQ3.10.10是3.10.x系列的一个维护版本(maintenance release),聚焦于修复经典镜像队列(classic mirrored queues)与 MQTT 插件在特定场景下的缺陷,并同步更新了 Erlang 运行时版本要求。本文以 release-notes/3.10.10.md 为核心,结合仓库源码逐一剖析每一项修复背后的实现细节、影响范围与升级注意事项,帮助读者在升级或排查问题时快速定位。
版本定位与升级前提
3.10.10属于3.10.x发布系列,属于维护版本,不带新增功能,主要目的是修复缺陷。如果从3.10.0之前的版本升级,请先参考 v3.10.0 release notes 中的升级章节(upgrade section),按步骤完成过渡升级,不能直接跨版本跳级。
本版本的另一个关键信息是 Erlang 运行时要求:
- 最低支持版本:Erlang 23 已到达其支持终点(end of support),因此本版本要求Erlang 24.2 或更高版本;
- 启动硬约束:在更老版本的 Erlang 上,节点将无法启动(Nodes will fail to start),这不是警告而是硬性失败;
- 推荐版本:Erlang 25,原因有三:
- 在 ARM64 架构上性能提升明显;
- 支持各架构下的火焰图(flame graphs)性能剖析;
- 包含最新的 TLS 1.3 实现。
更详细的版本对应关系,可参考仓库中的 docs/COMPATIBILITY.md 与 docs/compatibility.json。
核心服务器修复
部分回滚不安全的节点间通信优化
问题背景:本次修复部分回滚了一项被判定为不安全的节点间通信优化(原优化见 PR #3865 对应的优化逻辑),该优化可能影响经典镜像队列的操作顺序(operation ordering),进而破坏队列语义。
社区贡献:感谢 @bording 提供了可自动复现该问题的工具链,使得问题得以定位并验证修复效果。
当前实现佐证:经典镜像队列的节点间协调依赖rabbit_mirror_queue_misc等模块(参见 deps/rabbit/src/rabbit_mirror_queue_misc.erl),队列进程之间的消息投递与确认通过delegate:invoke_no_result/2等机制进行(见 deps/rabbit/src/rabbit_classic_queue.erl)。回滚该优化后,节点间通信恢复到更保守的顺序保证,代价是部分场景下的吞吐优化被放弃,换取镜像队列操作的确定性。
对运维的影响:正在使用经典镜像队列(policy 中ha-mode: exactly等镜像策略)的环境,建议尽快升级到本版本,以避免潜在的乱序风险。
经典镜像队列 Leader 过度发放 Credit 导致负载不均
问题背景:经典镜像队列的 Leader 副本向 Follower 副本发放了过多的 credit(信用额度),导致各副本之间的负载和内存占用不均——部分副本收到的消息量远大于其他副本,造成热点。
Credit 机制在源码中的体现:经典队列的 credit 流控贯穿rabbit_channel与队列进程之间的信用协商:
- 通道通过
credit/6接口向队列进程发送{credit, self(), Ctag, DeliveryCountRcv, LinkCreditRcv, Drain}请求(见 deps/rabbit/src/rabbit_classic_queue.erl); - 队列进程在投递消息时通过
credit_flow:send(QPid)进行信用计数(见 deps/rabbit/src/rabbit_classic_queue.erl); - 处理完 credit 请求后,通过
send_credit_reply/7返回#credit_reply{ctag, delivery_count, credit, avail, drain}结构(见 deps/rabbit/src/rabbit_classic_queue.erl)。
本次修复调整了 Leader 向 Follower 发放 credit 的额度策略,使消息在各副本间更均匀地分布,从而均衡内存占用与 CPU 负载。对于多节点、高吞吐镜像队列集群,这一修复能直接缓解“单副本内存暴涨”的告警场景。
集群内通信链路指标采集器异常修复
问题背景:当对端节点重启、集群内部 peer 连接刚刚重建(re-established)时,intra-cluster communication link 的指标采集器可能抛出异常,导致相关指标缺失或采集任务中断。
影响场景:滚动升级、单节点重启、网络分区恢复后,集群内节点间连接会频繁重建,此时如果指标采集器异常,监控面板上的链路指标(如 inter-node link 的发送/接收字节数)会出现空洞。
修复效果:本次修复让指标采集器在 peer 连接重建的竞态窗口内也能安全运行,不再抛出异常,保证 Prometheus 等监控数据连续可靠。
MQTT 插件修复
维护模式下错误地关闭了集群范围的全部 MQTT 连接
问题背景:当节点进入维护模式(maintenance mode)时,本应只关闭本节点本地的 MQTT 客户端连接,但修复前的实现错误地关闭了集群范围内所有节点的 MQTT 客户端连接,导致维护一个节点时,其他健康节点上的 MQTT 客户端也被强制断开,影响面远超预期。
源码实现佐证:修复后的实现位于 MQTT 插件的内部事件处理器中(deps/rabbitmq_mqtt/src/rabbit_mqtt_internal_event_handler.erl):
handle_event({event, maintenance_connections_closed, _Info, _, _}, ?STATE) -> {ok, NConnections} = rabbit_mqtt:close_local_client_connections(maintenance), ?LOG_WARNING("Closed ~b local (Web) MQTT client connections", [NConnections]), {ok, ?STATE};关键点在于close_local_client_connections/1——从函数命名和调用语义可以看出,它只处理本地节点维护的客户端连接,并返回关闭数量NConnections用于日志告警。这正是对“cluster-wide 误关闭”缺陷的针对性修复:事件在各节点本地触发,各节点只关闭自己维护的连接。
事件触发链路:该事件由rabbit_maintenance在节点进入维护模式(drain)时通过rabbit_event:notify(maintenance_connections_closed, ...)广播(见 deps/rabbit/src/rabbit_maintenance.erl),同时会先关闭本地 AMQP 客户端连接并挂起所有监听器。MQTT 插件的事件处理器订阅该事件后,仅对本节点的 MQTT 连接执行关闭,从而避免波及集群其他节点。
连接关闭的底层行为:本地连接关闭由rabbit_mqtt_reader的close_connection/2触发(见 deps/rabbitmq_mqtt/src/rabbit_mqtt_reader.erl),对maintenance这一关闭原因,读者进程会向客户端发送 MQTT 断开包,断开码为?RC_SERVER_SHUTTING_DOWN(0x8B,Server shutting down,见 deps/rabbitmq_mqtt/src/rabbit_mqtt_reader.erl),随后以{shutdown, {disconnect, server_initiated}}停止进程。这样 MQTT 客户端收到明确的服务端关闭原因,可以按 MQTT 规范进行优雅重连(配合clean session语义由客户端自行决策)。
运维建议:对使用 MQTT 插件的集群执行维护操作(如滚动升级、节点隔离)时,升级到3.10.10后,维护模式只会影响被维护节点上的 MQTT 连接,集群其他节点的 MQTT 客户端保持在线,业务中断面大幅缩小。
依赖升级
本版本没有依赖升级(Dependency Upgrades: None in this release),因此升级带来的回归风险主要来自上述代码修复本身,依赖层面的兼容性无需额外评估。
获取完整源码
要获取整个发行版的源代码,请下载名为rabbitmq-server-3.10.10.tar.xz的归档文件,而不要使用 GitHub 自动生成的源码 tarball——前者包含完整的构建依赖与子模块(如deps/下的全部插件),后者可能因子模块引用不完整而导致构建失败。
升级检查清单
| 检查项 | 要求 |
|---|---|
| Erlang 版本 | ≥ 24.2,推荐 25(ARM64 性能、火焰图、最新 TLS 1.3) |
| 跨版本升级 | 从 3.10.0 之前版本升级时,先完成过渡版本升级 |
| 经典镜像队列 | 修复 credit 发放与节点间通信顺序问题,建议升级 |
| MQTT 插件 | 修复维护模式误关集群连接,维护操作影响面更可控 |
| 依赖 | 无变化,无需额外兼容性验证 |
总结
3.10.10虽然是一个小版本维护发布,但其中两项修复对生产环境价值明显:一是经典镜像队列在节点间通信顺序与 credit 发放上的稳定性修复,直接关系到镜像队列的数据一致性与负载均衡;二是 MQTT 插件在维护模式下“误伤”整个集群连接的缺陷修复,让维护操作真正实现“局部可控”。配合 Erlang 24.2 的最低版本门槛,建议所有使用镜像队列或 MQTT 插件的3.10.x用户尽快规划升级,并参照 release-notes 目录下的其他版本说明制定升级路径。
- 后端
- 消息队列
- 消息路由
【免费下载链接】rabbitmq-server
Open source RabbitMQ: core server and tier 1 (built-in) plugins
相关推荐
RabbitMQ 3.11.2 维护版本解析:镜像队列稳定性修复与 MQTT 维护模式行为修正
RabbitMQ 3.11.2 维护版本解析:镜像队列稳定性修复与 MQTT 维护模式行为修正 RabbitMQ 3.11.2 是 3.11.x 发布系列中的一
后端消息队列消息路由RabbitMQ 3.10.24 维护版本深度解读:CQv1 队列索引恢复修复与 Erlang 版本要求
RabbitMQ 3.10.24 维护版本深度解读:CQv1 队列索引恢复修复与 Erlang 版本要求 本文以 RabbitMQ 3.10.x 系列的第 24
后端消息队列消息路由RabbitMQ 3.10.17 维护版本解析:Erlang 版本要求与 Management UI Admin 页签修复
RabbitMQ 3.10.17 维护版本解析:Erlang 版本要求与 Management UI Admin 页签修复 RabbitMQ 3.10.17 是
后端消息队列消息路由
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考