跳到主要内容
版本:1.0.0(开发版)

从 Java RocketMQ 迁移

变更部署前,先确定迁移边界。替换应用客户端、引入 Rust Broker 集群、搬迁存储数据是不同操作。本文为已有 RocketMQ 工作负载提供实施流程,不宣称存在通用的 Java 进程或数据目录原地转换方案。

1.0 核心范围以 Java RocketMQ 5.5.0 为比较基准,并列出明确排除项。结合实际版本和工作负载阅读协议兼容性。基准声明不能证明所有 Java SDK 版本、Controller 配置或高级消息模式均可互换。

选择迁移路径​

路径初始保留首先改变扩大流量前需要的依据
Java 应用改为 Rust 应用现有服务端点、主题、消费者组和业务契约SDK 集成、运行时所有权和结果处理精确客户端/服务端组合的操作、序列化、ACL/TLS、重试和关闭行为
Java 服务迁往独立 Rust 集群应用负载模式和业务标识新 NameServer/Broker 部署及运维工具目标配置组合的拓扑、配置、功能语义、持久性、恢复和容量
历史数据或进度迁移可恢复的源环境及已记录业务位置明确的重放/桥接方案,或另行确认兼容的离线流程所选方法的消息覆盖、重复、顺序、偏移量与恢复行为

评估期间分开源、目标集群的 NameServer 地址和存储根目录。使用已有 Broker 身份注册新实现可能改变在线客户端的路由。第二个进程不得与旧进程共享正在使用的存储目录。

1. 盘点应用契约​

为每个应用记录下列具体输入,作为迁移工作表,无需引入文档审批流程。

领域记录内容
端点Java SDK 版本、remoting 或 Proxy gRPC、NameServer 列表、Broker 广播地址、TLS/ACL 和命名空间行为
消息主题和消息类型、负载编码/模式、键/标签/属性、大小分布和压缩
生产者同步/异步/单向调用、超时预算、重试策略、队列选择、事务回查、延迟/召回
消费者消费者组、集群/广播模式、Push/Pull/POP/Lite 模式、选择器、队列分配、重试/死信和初始位置规则
业务完成幂等键、持久业务事务边界、偏移量/ACK 顺序、允许的重复和顺序范围
运维峰值流量、保留时间、恢复目标、监控信号、管理脚本和维护责任

把故障行为纳入契约。发送后超时可能意味着结果未知,重放不能建立在“消息肯定未存储”的假设上。消息 ID 和队列偏移量是有用的传输标识,但不能替代应用定义的幂等键。

2. 将概念映射到实际 Rust 接口​

Java 侧概念Rust 迁移决策
JVM 进程参数、堆和 GC 调优选择 Rust 构建配置和原生依赖,按归属组件配置运行时、线程、准入及存储。JVM 参数没有直接对应的 Rust 含义。
扁平 Broker properties使用规范 TOML,或显式 Broker properties 转换器并检查报告。保留期望数值,不保留扁平布局假设。
生产者生命周期向 builder 注入应用持有的 Arc<ClientRuntime>,启动门面、检查发送结果,再显式关闭门面和共享运行时。
Push 监听器选择并发或顺序处理,保持成功/重试语义、分配行为和业务事务边界。
Classic Pull用运行时驱动的兼容 builder 保留显式队列/偏移量所有权,或明确改用 LitePull 的分配和轮询模型。
消费偏移量区分下一读取位置、本地偏移量存储状态、远程提交和 Broker 持久化。
SQL 选择器除客户端选择器外,还需要启用 Broker 属性过滤。
DLedger / Java Controller不复用 Java 共识成员、快照或内部协议。Rust Controller 使用自己的 OpenRaft 和 HA 写权限契约。
mqadmin 脚本将每次调用改为 Rust CLI 的领域和末级命令,核对参数、凭据、输出和部分失败行为。

可执行示例见 Rust API 迁移、客户端配置及相应生产者/消费者文章。类名相似不代表构造函数或回调签名相同。

3. 搭建隔离目标环境​

先执行本地源码搭建和第一条消息流程,再按目标拓扑选择多节点部署或 HA 部署。使用独立的 Broker 身份和数据路径。

逐段迁移配置:Broker 身份与监听、NameServer 发现、Broker 元数据根目录、消息存储根目录、保留/刷盘策略、主题/消费者组设置、安全和可观测性。规范 TOML 的监听配置不是可以随意嵌套的 Java 属性;Broker 配置定义了可接受段及派生字段。

测试已有 Java properties 文件时,可显式使用转换入口:

cargo run -p rocketmq-broker -- -c /path/to/broker.properties --config-format properties -p

将路径替换为单独的工作副本。转换会写出报告,配置打印在绑定服务端口前退出。检查被拒绝或转换的设置和打印出的有效值;解析成功不能证明部署健康。本文编写期间没有针对 Java 配置执行这一示意命令。

不要带入 DLedger 配置并期待自动回退到另一种 HA 模式,Broker 会拒绝这些设置。不要将 Java Controller 状态目录作为 Rust Controller 存储根目录。gRPC 应用应部署和配置 Proxy,Broker remoting 端口不是 gRPC 端点。

4. 验证有代表性的消息路径​

场景观察内容
普通发送与消费负载和属性、发送状态、分配队列、消费内容及业务完成
超时与重试整体请求预算、未知结果、重复抑制和重试负载
再平衡与重启撤销队列停止处理,新分配从预期进度恢复,有界关闭
过滤与顺序重新分配情况下实际选择器和队列/顺序范围,而不只测试单生产者成功路径
使用中的事务/延迟/POP事务回查恢复、定时与召回竞争、不可见时间、ACK 和再次投递
需要保障的服务故障所选刷盘/复制策略、故障切换写权限、恢复时间和重放范围

只运行与应用相关的场景,但不要将基本收发结果推广到未经测试的高级模式。消费者组积压为零时,外部业务处理仍可能失败;HTTP 或传输成功时,操作状态仍可能失败。

网站第一条消息示例已在本地 Rust NameServer/Broker 上完成五条发送和五条接收。这不构成 Java/Rust 互操作试验或数据迁移试验,仍需针对实际源、目标组合执行相应验证。

5. 有计划地迁移流量和进度​

  1. 选择有界的应用、租户或分区批次及回退路由,在目标端准备主题、消费者组、权限和可观测性。
  2. 同一集群替换消费者实现时,记录已完成业务进度,停止旧所有者,再以预期消费者组和模式启动新所有者。已有消费者组偏移量可能优先于初始位置设置。
  3. 迁往独立目标集群时,明确历史消息如何到达:业务源重放、应用桥接或其他明确支持的方法。在所需保留窗口内维持源端可读。
  4. 将偏移量视为集群和队列专属位置,不要向另一队列复制一个数字就假设它标识同一消息。通过所选重放方法和业务标识映射进度。
  5. 观察目标结果、积压和错误行为后扩大流量。若两个生产者或桥接程序并发写入,应明确重复和顺序处理;双写不是跨集群原子提交。
  6. 满足应用重放/恢复窗口和运维义务后,再下线源端。

使用新消费者组进行对照会创建独立进度历史,并可能重放旧数据,应将业务效果导向隔离目标或实现幂等。同一组同时运行旧、新实现可能在它们之间分配队列,而不是提供完全相同的影子消息流。

6. 保留可操作的回退路径​

客户端回退可以恢复旧可执行文件和端点配置,但不会撤销已经完成的业务效果或偏移量推进。集群回退需要处理只被新集群接受的写入,在丢弃目标或切回路由前完成对账或重放。

保留源配置、可恢复数据和上一版应用制品。若流程改变持久化布局,应遵循升级与回退和备份与恢复。仅替换二进制或修改 storeType 不构成存储转换。

切换后保留正常运维记录:精确版本、所选 feature/模式、配置差异、测试场景、观察到的限制和未完成迁移工作的责任人,使后续故障可诊断,同时不宣称超出依据的兼容性。

来源:Broker 入口、客户端公共 API、HA 契约。