- 后端
- 消息队列
- 消息路由
【免费下载链接】rabbitmq-server
Open source RabbitMQ: core server and tier 1 (built-in) plugins
RabbitMQ 4.4.0 是 4.x 系列中的一个新特性版本,围绕流(Stream)基础设施、OAuth 2 认证与 AMQP 0-9-1 客户端兼容性带来了一系列值得关注的改进。本文以官方发布说明 release-notes/4.4.0.md 为主体,结合仓库源码与配置 schema,逐项解析破坏性变更、核心增强及其背后的实现原理,帮助你在升级前评估影响、升级后正确使用新能力。
升级前必读:Breaking Changes 与兼容性说明
AMQP 1.0 遗留头字段停止解析
4.4.0 起,以下四个 AMQP 0-9-1 头字段不再被解析:
x-amqp-1.0-properties x-amqp-1.0-app-properties x-amqp-1.0-message-annotations x-amqp-1.0-footer在 RabbitMQ 3.13 及更早版本中,这些头字段被用来承载通过 AMQP 1.0 协议接收到的消息中的 AMQP 1.0 区段(sections)。自 4.0 起,节点写入消息时已不再生成这些头字段,因此只有"由 3.13 或更早节点存储、且此后一直未被读取"的消息才会携带它们。升级到 4.4.0 后,这类消息仍然可以正常投递,但这些头字段会被当作普通x-头处理(即与其他x-头一样转换),而不会被还原为 AMQP 1.0 区段。
同理,以下三个消息注解(message annotations)也不再被解析:
x-basic-delivery-mode x-basic-priority x-basic-expiration这三个注解是 4.0 之前,当一条 AMQP 0-9-1 消息被编码为 AMQP 1.0 写入流(stream)时生成的。因此只有由 3.13 或更早节点写入的流条目会携带它们;4.4.0 读取这类条目时,不再恢复对应的三个属性(delivery-mode、priority、expiration)。
升级影响评估:这些头字段只在"3.13 及更早节点写入、且升级前从未被读取"的消息上出现,属于极窄的兼容性边界场景。若你的集群仍在 3.13 及以下版本运行,且存在长期未被消费的旧消息,建议在升级前评估这些消息的 AMQP 1.0 元数据是否有保留价值。
OIDC 发现响应校验更严格:升级前必须核对配置
OpenID Connect(OIDC)发现响应现在按照更严格的规则进行校验。升级后,以下两种情况会导致发现校验失败:
- 身份提供商(IdP)的发现文档中提供了非 HTTPS(
http://)端点; - 发现文档中的
issuer声明与用于获取该文档的发现端点不匹配(按照 OpenID Connect Discovery 1.0 §4.3 的约定校验)。
该变化已知会影响 CloudFoundry UAA:它的issuer是其令牌端点(token endpoint)URL,而不是发现端点的前缀,因此默认校验下会失败。
升级前的应对:如果您的身份提供商不满足上述约定,请在升级前将以下配置设为false:
# rabbitmq.conf 中的设置示例 auth_oauth2.discovery.verify_issuer = false auth_oauth2.discovery.verify_https_endpoints = false关于校验规则与配置选项的完整说明,参见官方文档的 Discovery Payload Validation 一节;仓库内的配置 schema 位于 deps/rabbitmq_auth_backend_oauth2/priv/schema/rabbitmq_auth_backend_oauth2.schema(源码实现见 deps/oauth2_client/src/oauth2_client.erl)。
GET /api/auth/hash_password/:password废弃
管理 API 的GET /api/auth/hash_password/:password端点不再对密码做哈希——因为 URL 路径中的密码可能残留在访问日志、代理服务器日志或 shell 历史中。请改用POST /api/auth/hash_password,并通过 JSON 请求体传递密码:
curl -u guest:guest -X POST http://localhost:15672/api/auth/hash_password \ -H 'content-type: application/json' \ -d '{"password": "your-password-here"}'Core Server 核心增强与源码级解析
流支持非零初始偏移:x-stream-initial-offset
4.4.0 引入了一个重要的流(Stream)新特性:流可以从非 0 的偏移量开始。新增的x-stream-initial-offset队列参数用于指定发布到流的第一条消息的偏移量,即流为空时first和next这两个偏移规格(offset specification)所解析到的值。流协议层面,该参数通过Create命令的stream-initial-offset参数暴露。
声明流时使用该参数的示例:
# 使用 rabbitmq-stream-go 等客户端或 AMQP 0-9-1 声明流队列时: # 参数名 x-stream-initial-offset,值为非负整数,例如 1000 rabbitmqctl add_vhost_stream_test # 通过 rabbitmqadmin 或代码声明流队列并指定初始偏移关键约束(务必注意):
- 流的起始偏移在创建时即固定,没有对应的策略(policy)等价物;
- 以不同值重新声明该流会被拒绝(即再次声明时参数值必须一致,否则报错)。
从源码实现看,参数校验逻辑位于 deps/rabbit/src/rabbit_stream_queue.erl 的check_initial_offset/1:
- 偏移量必须是非负整数,否则返回
precondition_failed("x-stream-initial-offset value must be a non-negative integer"); - 偏移量不能超过上限
?MAX_STREAM_INITIAL_OFFSET,该宏定义在 deps/rabbit/include/rabbit_stream_queue.hrl,值为(1 bsl 62) - 1(即 2^62 - 1)。注释解释了原因:Osiris 使用有符号 64 位计数器保存偏移量,取其一半范围,能为从最大值处开始的流保留同样多的消息增长空间; - 该特性依赖功能开关
rabbitmq_4.4.0:若功能开关未启用(例如混合版本集群中还存在 4.3.x 副本),声明会被拒绝。原因是旧节点上的副本会从偏移 0 开始日志,随后拒绝写入端第一个按新偏移生成的 chunk(视为乱序)。该功能开关定义在 deps/rabbit/src/rabbit_core_ff.erl,stability => stable,depends_on => ['rabbitmq_4.3.0']。
使用场景:该特性适用于迁移/重放场景——例如将外部系统的历史数据以原始偏移写入流,使消费端能按原始偏移续读,或让多个流在逻辑上共享同一个偏移空间。相关测试覆盖见 deps/rabbit/test/unit_stream_arg_validation_SUITE.erl 与 deps/rabbitmq_stream/test/commands_SUITE.erl。
流协调器 Raft 状态机升级到 v8,旧版本行为被冻结
流的协调器(stream coordinator)Raft 状态机版本号推进到第 8 版。与rabbit_fifo/rabbit_fifo_v7的处理方式一致,v7 的行为被冻结在独立的模块 deps/rabbit/src/rabbit_stream_coordinator_v7.erl 中。这样做的意义在于:
- 旧的日志条目(log entries)与混合版本集群在回放(replay)时,会命中字节级一致(byte-identical)的代码;
- 从而保证滚动升级过程中,新旧节点对同一段 Raft 日志的解析结果完全一致,避免因状态机语义漂移导致的数据不一致。
这是 RabbitMQ 对"状态机演化"的标准做法:新逻辑放进主模块(deps/rabbit/src/rabbit_stream_coordinator.erl),历史版本冻结为独立模块,回放路径根据日志版本路由到对应实现。同类模式可见rabbit_fifo/rabbit_fifo_v7/rabbit_fifo_v8等模块。
成员动作重试退避收敛到状态机内部
4.4.0 中,成员动作(member action)的重试退避(retry backoff)改由状态机自身负责,取代了此前为退避窗口而阻塞的 worker 进程:
- 失败的动作被"停放"(parked),由**单个合并定时器(coalesced timer)**统一重新驱动;
- 默认采用带抖动的短延迟(short jittered delay);
- 节点宕机(node-down)导致的失败会被停放,直到该节点的
nodeup事件触发,避免在**大规模断连(mass disconnections)**期间出现惊群效应(thundering herd)和反复探测宕机节点。
并发动作 worker 数量有界化
启动、停止、删除、更新等动作的并发 worker 数量现在有上限,默认64,可通过应用环境参数stream_coordinator_max_concurrent_actions配置。超出的动作会在 aux 状态中排队,等运行中的 worker 完成后才启动,因此大规模流事件(mass stream event)不会再一次性爆发式创建无界数量的 worker(及其反馈命令)。
源码佐证位于 deps/rabbit/src/rabbit_stream_coordinator.erl:默认值定义-define(DEFAULT_MAX_CONCURRENT_ACTIONS, 64).,并在 deps/rabbit/src/rabbit_stream_coordinator.erl 处通过application:get_env(rabbit, stream_coordinator_max_concurrent_actions, ...)读取。若需调整,可在 rabbitmq.conf 或 advanced.config 中设置rabbit.stream_coordinator_max_concurrent_actions。
重连处理按受影响范围伸缩
流协调器与单一活跃消费者(single active consumer)协调器的节点/连接重连处理,现在按**受影响的规模(affected footprint)**伸缩,而不是按流的数量或组(group)的总数。效果是:在分区恢复(partition heals)、节点重启或滚动升级完成后,协调器负载显著降低——因为不再需要对全部流/组逐一触发重连检查。
流协调器活性(liveness)缺陷修复
本次修复了多个流协调器的活性缺口:
- 流可能失去 writer 且没有事件触发恢复的缺陷;
- 过期的
start动作在重新选举(re-election)后仍存活的缺陷; - 副本在
nodeup时保持断连而非恢复的缺陷。
这些修复保障了协调器在故障转移、网络分区等场景下的自愈能力。
Auth Backend OAuth 2 插件:OIDC 发现校验落地
与升级说明中的 Breaking Change 相呼应,4.4.0 在rabbitmq_auth_backend_oauth2插件中正式实现了 OIDC 发现响应的校验,规则遵循OpenID Connect Discovery 1.0 §4.3。实现位于 deps/oauth2_client/src/oauth2_client.erl(verify_issuer与verify_https_endpoints默认均为true),配置定义于 deps/rabbitmq_auth_backend_oauth2/priv/schema/rabbitmq_auth_backend_oauth2.schema。
两个校验项的含义:
| 配置项 | 默认值 | 校验内容 |
|---|---|---|
auth_oauth2.discovery.verify_https_endpoints | true | 要求发现到的jwks_uri、token_endpoint、authorization_endpoint、end_session_endpoint使用 HTTPS 协议 |
auth_oauth2.discovery.verify_issuer | true | 校验发现文档中的issuer存在、使用 HTTPS,且与用于获取发现文档的发现端点匹配 |
完整的配置层级支持全局与 per-provider 两种形式:
# 全局设置 auth_oauth2.discovery.verify_https_endpoints = false auth_oauth2.discovery.verify_issuer = false # 按 provider 设置(schema 中对应的 mapping 项) # auth_oauth2.oauth_providers.$name.discovery.verify_https_endpoints # auth_oauth2.oauth_providers.$name.discovery.verify_issuer注意 schema 注释中的提醒:仅在身份提供商的发现文档使用http(例如开发/测试环境)时才关闭verify_https_endpoints;仅在 IdP 的issuer不遵循 §4.3 约定时才关闭verify_issuer。测试覆盖见 deps/oauth2_client/test/unit_SUITE.erl 与 deps/rabbitmq_auth_backend_oauth2/test/config_schema_SUITE_data/rabbitmq_auth_backend_oauth2.snippets。
Erlang AMQP 0-9-1 客户端:URI 参数严格校验
auth_mechanism参数受限
AMQP 0-9-1 URI 中的auth_mechanism查询参数,现在仅接受客户端实际支持的机制:plain、amqplain、external、crdemo。不支持的取值会在URI 解析阶段被拒绝,而不再等到连接建立时才报错。该行为同样作用于Shovel 和 federation 插件——它们以相同方式解析 URI,因此获得了同等的早期失败保障。
verify参数受限
URI 中的verify查询参数现在只接受verify_peer或verify_none,不支持的取值同样在 URI 解析阶段即被拒绝,而不是等到 TLS 连接建立时才失败。
升级影响:如果你的 Shovel/federation 配置或客户端代码中使用了非法的auth_mechanism或verify取值,升级后将在解析阶段立即暴露错误,便于快速定位配置问题。
依赖变更
osiris升级到1.13.2;ra升级到3.2.0。
其中osiris是 RabbitMQ 流(streams)的底层存储引擎,ra是提供 Raft 共识实现的库——两者的升级与本次流协调器状态机 v8、流初始偏移等能力直接相关,也解释了为何 4.4.0 会引入rabbitmq_4.4.0这一依赖 4.3.0 的稳定功能开关来约束滚动升级。
升级路径建议与获取源码
综合本次变更,给出如下升级建议:
- 升级前:检查 OAuth 2 配置。若使用 CloudFoundry UAA 或任何
issuer不匹配发现端点、或提供 HTTP 端点的 IdP,先在 4.4.0 之前设置auth_oauth2.discovery.verify_issuer/verify_https_endpoints为false,避免升级后发现校验失败; - 升级前:将依赖
GET /api/auth/hash_password/:password的脚本迁移到POST /api/auth/hash_password(JSON body); - 升级中:若集群跨 4.3.x 滚动升级,
x-stream-initial-offset在rabbitmq_4.4.0功能开关启用前不可用,且不要在功能开关未全面启用时声明带初始偏移的流; - 升级后:对于需要从非零偏移开始的新流,使用
x-stream-initial-offset队列参数(或流协议Create命令的stream-initial-offset参数),并注意偏移在创建时固定、不可通过策略修改、重新声明必须使用相同值。
获取完整发行版源码时,请下载名为rabbitmq-server-4.4.0.tar.xz的归档,而非 GitHub 生成的 source tarball(后者不包含完整的构建体系)。
本文引用文件速览(均为仓库内相对路径):
- 发布说明原文:release-notes/4.4.0.md
- 流初始偏移参数校验:deps/rabbit/src/rabbit_stream_queue.erl、上限宏定义 deps/rabbit/include/rabbit_stream_queue.hrl
- 流协调器实现与并发上限:deps/rabbit/src/rabbit_stream_coordinator.erl、冻结版本 deps/rabbit/src/rabbit_stream_coordinator_v7.erl
- 功能开关定义:deps/rabbit/src/rabbit_core_ff.erl
- OIDC 校验实现:deps/oauth2_client/src/oauth2_client.erl、配置 schema deps/rabbitmq_auth_backend_oauth2/priv/schema/rabbitmq_auth_backend_oauth2.schema
- 相关测试:deps/rabbit/test/unit_stream_arg_validation_SUITE.erl、deps/rabbitmq_stream/test/commands_SUITE.erl、deps/oauth2_client/test/unit_SUITE.erl
- 后端
- 消息队列
- 消息路由
【免费下载链接】rabbitmq-server
Open source RabbitMQ: core server and tier 1 (built-in) plugins
相关推荐
Slang 初始器表达式与初始化列表表达式一致性测试深度解析
Slang 初始器表达式与初始化列表表达式一致性测试深度解析 本文以 Slang 仓库中 docs/generated/tests/conformance/ex
编译器图形学编程语言TypeSpec 1.8.0 版本特性深度解读:日期时间 now() 初始化器、装饰器验证回调与 OpenAPI 3.2.0 defaultMapping
TypeSpec 1.8.0 版本特性深度解读:日期时间 now 初始化器、装饰器验证回调与 OpenAPI 3.2.0 defaultMapping 本篇文章
编程语言编译器后端TypeSpec 1.3.0 版本特性深度解析:CLI 初始化增强、版本依赖简化与编译器内核改进
TypeSpec 1.3.0 版本特性深度解析:CLI 初始化增强、版本依赖简化与编译器内核改进 本篇文章以 TypeSpec 官方仓库发布的 1.3.0 版本
编程语言编译器后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考