No route info of this topic 表示客户端没有获得可用的目标 Topic 路由,不能只凭这句话就认定“忘了打开自动创建”。先确认客户端连接了哪一组 NameServer、它知道哪些 Broker 和队列,再检查网络与版本。

三次相似报错,不是同一场故障

2019 年 9 月在 Windows 测试时,Broker 已带 autoCreateTopicEnable=true 启动,生产者仍报:

No route info of this topic, TopicTest

当时转向用管理工具手工创建 Topic。但没有完整创建后路由与发送对照,不能证明 Windows 不支持自动创建,也不应把怀疑写成平台规则。

2019 年 11 月,新搭 NameServer、Broker 使用 4.4.0,旧 producer/consumer 仍是 4.3.0。调整客户端到 4.4.0 后,当时问题解决。

2021 年 5 月又遇到服务端 4.8.0、示例客户端 4.6.0 的组合,自动创建设置没有解决问题,排查再次转向版本。两次历史观察都提醒我核对依赖,但不构成“所有客户端和服务端版本必须完全相同”的兼容矩阵。

先查 NameServer 中的实际路由

Apache RocketMQ 4.x FAQ 把 Topic 路由和 NameServer 配置列为检查项。用部署版本自带管理工具的帮助确认参数后,可在获授权环境查询:

./mqadmin topicRoute -n 127.0.0.1:9876 -t TopicTest

Windows 对应使用 mqadmin.cmd。示例中的地址仅表示本机 NameServer,需替换成客户端实际访问的目标;命令用于查询,不创建 Topic。

如果没有路由,查 Broker 是否已向正确 NameServer 注册、目标 Topic 是否存在、读写队列及权限是否符合用途。若路由存在,再从客户端所在网络确认 Broker 上报地址是否可达,不能只验证 NameServer 的 9876 端口。

手工创建 Topic 是配置操作,不是通用重试按钮

历史上使用过 updateTopic。该命令会改变 Broker 元数据,不能把从日志看到的任意地址直接当目标执行,也不要为一个业务 Topic 无限制开启自动创建。

确需创建时,先确认集群、Broker、Topic 名称、队列与权限及变更授权,再按对应版本管理文档操作。创建成功后仍要重新查询路由并验证受控发送,不能把命令退出成功等同于消息已到达消费者。

再检查版本、依赖和实际配置

保留客户端依赖树、Broker/NameServer 版本、启动配置与最早失败日志。尤其检查间接依赖是否带来另一套 rocketmq-client,配置文件是否真正用于当前进程,以及 producer 是否指向另一个环境。

统一一组已验证的版本组合可以降低变量,但更换后恢复,只能说明改动与结果相关;没有协议日志或上游修复证据时,不把它写成所有版本故障的唯一原因。运行恢复还应区分路由可查询、Broker 可达、发送成功和消费完成四个阶段。