资讯动态

RabbitMQ 3.11.4 维护版本深度解析:流(Streams)增强、quorum 工具改进与全量变更清单

发布时间:2026/9/23 10:59:50 来源:尧图企业网站定制
RabbitMQ 3.11.4 维护版本深度解析流Streams增强、quorum 工具改进与全量变更清单【免费下载链接】rabbitmq-serverOpen source RabbitMQ: core server and tier 1 (built-in) plugins项目地址: https://gitcode.com/gh_mirrors/ra/rabbitmq-server导读RabbitMQ3.11.4是3.11.x发布系列中的维护版本聚焦于**核心服务器Core Server**在流Streams与 quorum 队列Quorum Queues上的稳定性与性能提升、CLI 工具在运维诊断上的能力增强以及LDAP / STOMP 插件的缺陷修复与功能补充。本文以该版本的官方发布说明为骨架结合当前仓库内对应源码实现如 rabbit_stream_queue.erl、rabbit_amqqueue.erl 与 rabbitmq_cli 中相关命令实现展开纵深讲解帮助读者理解每个变更背后的工作原理、适用场景与实战操作方式。版本基线Erlang 25 与升级前提3.11.4属于3.11.x系列是从 3.11.0 起的连续维护版本。官方发布说明中明确强调了两点硬性前提必须使用 Erlang 25 及以上版本从 3.11.0 开始RabbitMQ 的最低受支持 Erlang 版本即为 Erlang 25使用更旧 Erlang 的节点将无法启动will fail to start。旧版本升级若从 3.11.0 之前的版本升级需要先参考 v3.11.0 发布说明中的升级章节确认升级路径与注意事项。选择 Erlang 25 作为新基线带来的直接收益按照发布说明的描述包括ARM64 架构上显著更好的性能所有架构上都可使用的profiling 火焰图flame graphs能力面向所有 3.11 用户的最新 TLS 1.3 实现。注意Erlang 与 RabbitMQ 的详细兼容矩阵不在本仓库内如需确认具体 Erlang 补丁版本要求请以官方 Erlang/OTP 兼容性说明为准。核心服务器Core Server增强本节是3.11.4变更的重头戏全部围绕流Streams与 quorum 队列Quorum Queues两大新型队列类型展开。它们都基于 osiris 日志复制子系统实现本版本中 osiris 由 1.3.3 升级至 1.4.0见文末依赖升级章节因此性能与内存相关改动大多落在这两类队列上。大量流的定义文件导入更高效变更包含大量流streams的定义文件definition files导入效率得到提升。实现背景流的定义导入路径走 rabbit_definitions.erl → 本地文件系统导入模块 rabbit_definitions_import_local_filesystem.erl该模块同时支持单个 JSON 文件与conf.d风格的目录加载。每条流的声明都会触发一次底层日志副本的创建与复制组配置计算当定义文件中流数量很大时逐条串行处理的开销会线性放大。本次优化即针对这一大批量场景减少导入过程中不必要的重复计算与同步等待。实战提示如果你通过definitions配置或rabbitmqctl import_definitions批量导入含数百上千条流的 JSON 定义升级到 3.11.4 后导入耗时与导入期间的节点负载都会有所改善。大量空闲流场景下的 CPU 吞吐优化变更在集群中存在大量大部分时间空闲mostly idle的流时CPU 吞吐量下降即 CPU 占用降低。实现背景从源码看流队列的底层运行时由update_stream_conf/2生成的配置驱动见 rabbit_stream_queue.erl包括max_bytes、max_age、max_segment_size_bytes、filter_size等保留策略参数。空闲流的主要开销在于后台周期任务与复制组心跳本次优化针对这些空闲副本的调度与计时逻辑减少了无消息流动时的无效唤醒。实战提示该改动与下一条max_age 保留策略每小时回收磁盘配合专门针对大量长期不活跃但设置了保留策略的流这一典型场景例如 IoT 数据管道中按max-age保留的传感器数据流。max_age 保留策略每小时自动回收磁盘空间变更设置了max_age保留策略的流现在每小时尝试回收一次磁盘空间。这对大量不活跃但设置max_age的流的环境尤为重要。实现原理源码级参数解析流的保留策略来自队列参数或策略policy源码中通过args_policy_lookup(max-age, ...)读取并经过max_age/1统一转换见 rabbit_stream_queue.erl最终落入Retention配置Retention lists:filter(fun({_, R}) - R / undefined end, [{max_bytes, MaxBytes}, {max_age, MaxAge}]),单位解析与校验max-age的字符串在 rabbit_amqqueue.erl 的check_max_age/1中解析支持正则(^[0-9])(.*)即数字 单位格式合法单位为 | 单位 | 含义 | 换算 | |------|------|------| |Y| 年 | 365 天 | |M| 月 | 30 天 | |D| 天 | 24 小时 | |h| 小时 | 3600 秒 | |m| 分钟 | 60 秒 | |s| 秒 | 1 秒 |非法单位或非正数会被拒绝invalid_max_age。同时该参数也作为流队列声明参数x-max-age被 rabbit_amqqueue.erl 校验要求类型为长字符串longstr。回收时机本次变更将磁盘回收从消息写入时顺带触发扩展为周期性的每小时任务确保即便流长时间没有新消息写入过期数据也能被及时清理从而在大量不活跃 max_age 保留的组合场景下稳定控制磁盘占用。声明方式示例通过策略对所有流生效# 为所有流设置 7 天保留期策略方式 rabbitmqctl set_policy stream-retention ^.*$ {max-age: 604800000} --apply-to streams注意max-age在策略中以毫秒整数形式提供RabbitMQ 策略的max-age值按毫秒解析而流声明参数x-max-age则支持7D、10h这类带单位字符串见 stream-receiver.py 中x-max-age: 10h的用法。两种途径解析出的毫秒值最终都会被写入 osiris 的retention配置。quorum 队列对 WAL 日志增长的韧性提升变更在客户端注册消费者后从不消费任何消息也未取消消费者就直接关闭 channel/连接的工作负载下quorum 队列对 WALWrite-Ahead Log预写日志增长的韧性显著增强GitHub issue #6447。背景quorum 队列基于 Raft 协议所有写操作先落 WAL 再异步刷盘。当一个消费者注册后立即断开、且从未消费消息时队列可能反复经历追加消费者记录 → WAL 增长 → 从未真正消费的循环如果 WAL 持续膨胀而刷盘跟不上会拖累整个复制组的性能甚至可用性。本次修复针对该路径减少了此类无效消费者注册对 WAL 体积的负面影响。实战提示如果你的业务存在大量临时订阅型客户端例如监控探针、健康检查连接升级本版本后应能观察到 quorum 队列在message_store/WAL 指标上的增长更平稳。大批量死信到经典镜像队列降低峰值内存变更将大量消息死信dead-letter到经典镜像队列classic mirrored queues已弃用时峰值内存占用更低GitHub issue #5312。背景死信转发本质上是把原队列的消息批量重新发布到目标队列。当目标是经典镜像队列且消息量巨大时转发过程中积压在内存中的批次消息是主要内存压力来源。本次优化改进了批处理粒度降低了大批量死信场景下的瞬时内存峰值。实战提示仍在维护经典镜像队列ha-mode策略且依赖死信功能的部署升级后可缓解死信风暴时的 OOM 风险同时建议规划向 quorum 队列或流迁移因为经典镜像队列在后续版本中已逐步弃用。核心服务器 Bug 修复无效 definitions.local.file 导致拒绝启动变更节点启动时若遇到无效的definitions.local.file本地定义文件将拒绝启动refuse to start而不再像以前那样忽略该文件继续启动GitHub issue #2610。实现背景本地定义加载由 rabbit_definitions_import_local_filesystem.erl 负责支持单个 JSON 文件或conf.d风格目录。此前若文件内容损坏或格式非法节点可能静默跳过导致实际运行配置与预期不一致——这种静默失败在集群中尤其危险因为不同节点可能因解析结果不同而出现配置漂移。本次变更将启动阶段的解析失败升级为致命错误强制运维人员及早暴露并修复定义文件问题。实战提示升级前请务必验证definitions.local.file指向的文件可被当前版本正确解析可使用rabbitmqctl import_definitions先做预检启动日志中出现 definition 相关错误时应优先检查本地定义文件是否与版本兼容。类型分析器定义修复变更修复了一处类型分析器type analyzer定义由 illotum 贡献GitHub PR #6401。影响范围属于 Erlang 静态分析/类型规范层面的小修复对运行时行为无直接影响主要服务于使用 Dialyzer 等工具对 RabbitMQ 代码做静态检查的场景。CLI 工具增强本版本对 CLI 的改动集中在运维诊断与升级准备两个方向且都体现了quorum 意识的扩展——从只关注 quorum 队列扩展到同时关注流。检查命令现在将流副本纳入 quorum 关键性判断变更以下两个命令现在会将流streams的副本放置而不仅是 quorum 队列纳入目标节点是否为 quorum-criticalquorum 关键节点的判断GitHub PR #6448rabbitmq-diagnostics check_if_node_is_quorum_criticalrabbitmq-upgrade await_online_quorum_plus_one命令详解rabbitmq-diagnostics check_if_node_is_quorum_critical实现见 check_if_node_is_quorum_critical_command.ex健康检查类命令若存在目标节点关闭后将失去 quorum的 quorum 队列或流则以非零退出码退出其帮助文本明确写道Health check that exits with a non-zero code if there are queues/streams with minimum online quorum。该命令常用于节点关闭前的安全检查。rabbitmq-upgrade await_online_quorum_plus_one实现见 await_online_quorum_plus_one_command.ex等待所有 quorum 队列/流都至少有quorum 1个在线副本用于滚动升级前的准备阶段。从源码可见其关键逻辑单节点集群直接返回{:ok, :single_node_cluster}检查无意义避免误报否则 RPC 调用rabbit_upgrade_preparation:await_online_quorum_plus_one/2等待超时默认120_000毫秒default_timeout 120_000可通过--timeout覆盖超时错误信息为time is up, no quorum 1 online replicas came online for at least some quorum queues or streams。实战流程滚动升级前# 1. 确认目标节点不是任何 quorum 队列/流的 quorum 关键节点 rabbitmq-diagnostics check_if_node_is_quorum_critical # 2. 等待所有 quorum 队列与流都具备 quorum 1 在线副本默认超时 120s rabbitmq-upgrade await_online_quorum_plus_one # 3. 可选调整超时单位毫秒 rabbitmq-upgrade await_online_quorum_plus_one --timeout 300000重要行为变更在 3.11.4 之前这两个命令只评估 quorum 队列如果一个集群只有流而没有 quorum 队列命令可能误报无风险。3.11.4 之后流副本也被纳入评估能更真实地反映节点关闭对数据可用性的影响。队列信息键支持更多兼容性属性名变更队列信息queue info键现在支持更多与已弃用的经典镜像队列相关的包容性属性名。例如可以用mirror_pids代替slave_pids由 illotum 贡献GitHub issue #2635。背景slave/master这类术语在业界已被广泛认为应替换为更具包容性的mirror/leader等表述。此改动让依赖rabbitmqctl list_queues输出的脚本/工具可以使用新键名同时保持旧键名向后兼容。实战示例# 旧写法仍可用 rabbitmqctl list_queues name slave_pids # 新写法3.11.4 起支持 rabbitmqctl list_queues name mirror_pidsmemory_breakdown 性能大幅提升变更rabbitmq-diagnostics memory_breakdown在拥有大量例如数万到数十万quorum 队列的环境中执行速度快了两个数量级two orders of magnitudeGitHub issue #6388。背景memory_breakdown通过 RPC 在目标节点上聚合各子系统进程、ETS 表、binary、队列等的内存占用明细。在 quorum 队列数量极大时逐个队列汇总的开销非常可观。本次优化从命令实现 memory_breakdown_command.ex 及其底层聚合逻辑入手显著压缩了这类环境下的执行耗时。实战提示如果你运行着大规模 quorum 队列集群并习惯用memory_breakdown排查内存问题升级后该命令的反馈速度会有可感知的提升发布说明原文称快约 100 倍。CLI 工具 Bug 修复definitions.skip_if_unchanged 下的 JSON 导出失败变更修复了在使用了definitions.skip_if_unchanged配置的节点上定义文件 JSON 导出definition export失败的问题GitHub issue #6424。实现背景skip_if_unchanged是定义导入时的去重机制其逻辑位于 rabbit_definitions.erl当本地定义文件的哈希与上一次导入一致时跳过重复导入。此前在启用该机制后导出路径rabbitmqctl export_definitions/ HTTP APIGET /api/definitions会因哈希状态未正确初始化而报错本次修复确保跳过未变更定义与导出定义两条路径互不干扰。quorum 队列专用命令作用于流时给出更清晰错误变更在流上使用 quorum 队列专用命令时现在会返回更清晰的错误信息由 gomoripeti 贡献GitHub PR #6488。背景流与 quorum 队列虽共享部分底层机制osiris 复制、quorum 概念但命令接口并不完全互通。此前在流上执行如 quorum 队列成员管理类命令可能产生晦涩的报错本次改动让错误信息明确提示该命令不适用于流降低误用排查成本。LDAP 插件 Bug 修复变更修复了 LDAP 服务器密码在某些类型的异常中可能出现在日志里的问题由 SimonUnge 贡献GitHub issue #4842。背景rabbitmq_auth_backend_ldap负责与 LDAP 服务器交互完成认证/授权。当 LDAP 连接或绑定过程抛出异常时异常堆栈中可能携带绑定凭据进而被日志记录器写入日志文件——这属于敏感信息泄露类问题。本次修复对异常处理路径做了清洗避免密码进入日志。实战建议升级后建议检查历史日志是否已存在此类泄露同时遵循最小权限原则为 RabbitMQ 的 LDAP 绑定账号使用独立的只读服务账号并妥善保管rabbitmq_auth_backend_ldap.server相关配置中的凭据。STOMP 插件增强流保留策略 x-max-age变更STOMP 客户端现在可以通过**消息头header**设置流的x-max-agestream retention 保留期限设置GitHub issue #5003。实现细节源码级STOMP 插件在头文件 rabbit_stomp_headers.hrl 中定义了头常量-define(HEADER_X_MAX_AGE, x-max-age).这意味着 STOMP 客户端在SEND帧用于向流发布消息中携带x-max-age头时插件会将其作为流的保留策略参数解析。结合 rabbit_stream_queue.erl 对max-age的解析逻辑该头支持带单位字符串如10h、7D。客户端示例参照 stream-receiver.py 与测试用例 x_queue_type_stream.pyimport stomp conn stomp.Connection([(localhost, 61613)]) conn.connect(guest, guest, waitTrue) headers { destination: /amq/queue/my-stream, x-queue-type: stream, # 声明为流队列 x-max-age: 10h # 3.11.4 起支持通过头设置保留期 } conn.send(, headersheaders) # 向流发布一条消息 conn.disconnect()应用场景STOMP 客户端典型如各类脚本、传感器网关现在无需预先通过 HTTP API 或策略创建流即可在发布时按需指定数据保留时长特别适合每个流不同保留期的动态数据管道场景。依赖升级依赖升级方向关联osiris1.3.3→1.4.0流与 quorum 队列共用的日志复制/保留引擎背景说明osiris 是 RabbitMQ 流与 quorum 队列底层的日志子系统提供复制组、段文件、保留回收等能力。本节核心服务器增强中关于流的多项改动空闲流 CPU 优化、max_age每小时磁盘回收、定义导入效率均依赖 osiris 1.4.0 提供的底层能力因此 osiris 升级与核心服务器增强是配套发布的。升级 RabbitMQ 到 3.11.4 时请确保 osiris 版本随之更新随发行包自动完成。获取源码归档官方发布说明特别提醒如需获取整个发行版的源代码请下载名为rabbitmq-server-3.11.4.tar.xz的归档文件不要使用 GitHub 自动生成的源码 tarball后者不包含完整的打包构建环境与全部依赖。源码构建与开发环境搭建的更多细节可参考仓库根目录的 README.md 与 erlang.mk。总结与升级建议3.11.4是一次典型的稳中求进维护版本变更脉络清晰流的运维友好度大幅提升大批量定义导入更快、空闲流 CPU 占用更低、max_age保留策略每小时自动回收磁盘——三者合力解决了大量不活跃流这一现实痛点quorum 一致性工具更准确两个关键运维命令纳入流副本评估避免滚动升级前的误判安全与健壮性修复LDAP 密码不再泄露进日志、无效本地定义文件拒绝启动、skip_if_unchanged下的导出失败被修复插件能力扩展STOMP 客户端可通过x-max-age头按需设置流保留期。升级建议清单确认集群所有节点运行Erlang 25否则节点拒绝启动预检definitions.local.file指向的定义文件可被 3.11.4 正确解析滚动升级流程中使用升级后的check_if_node_is_quorum_critical与await_online_quorum_plus_one注意它们现在也会评估流副本若运行大量不活跃流并依赖max-age保留升级后可观察磁盘回收是否按小时规律触发关注osiris版本须为1.4.0确保流相关底层优化生效。【免费下载链接】rabbitmq-serverOpen source RabbitMQ: core server and tier 1 (built-in) plugins项目地址: https://gitcode.com/gh_mirrors/ra/rabbitmq-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价