发送消息时返回“MQClientException: No route info of this topic”错误

更新时间:
复制 MD 格式

问题现象

使用TCP协议SDK发送消息时,云消息队列 RocketMQ 版服务端返回如下错误:

Caused by: com.aliyun.openservices.shade.com.alibaba.rocketmq.client.exception.MQClientException: No route info of this topic

可能原因

  • 代码中设置的接入点和云消息队列 RocketMQ 版控制台上提供的不一致。

  • 代码中设置的Topic名称和已创建的Topic的名称不一致。

  • SDK版本不匹配。针对有命名空间的实例,使用的SDK版本必须大于1.7.9.Final。若实例有命名空间,且错误信息后没有{instancId}%{topic}内容,说明使用的SDK版本不正确。

  • 网络抖动或Name Server连接不稳定。如果该错误为偶发性出现,通常是因为客户端与Name Server之间的网络连接出现短暂中断,导致Topic路由信息未能及时刷新。

解决方案

  1. 登录云消息队列 RocketMQ 版控制台

  2. 实例详情页面查看实例的接入点,检查代码中设置的接入点是否和控制台提供的一致。

  3. Topic 管理页面查看代码中设置的Topic是否已创建且拼写正确。

  4. 实例详情页面的基础信息区域查看实例是否有命名空间。若实例有命名空间,且错误信息中没有{instanceId}%{topic},说明SDK版本不正确,请确保使用的SDK版本大于1.7.9.Final。

  5. 如果以上排查均正常且该错误为偶发性出现,请检查客户端所在机器的网络连接是否稳定。建议在发送消息的代码中添加重试逻辑,以应对因网络抖动导致的偶发性路由信息获取失败。同时建议将SDK升级至最新版本,以获取更好的容错和自动重连能力。

HTTP 协议 SDK 排查

使用 HTTP 协议 SDK 时,接入点体系与 TCP 协议 SDK 不同,需单独核实:

  1. 实例详情页面查看 HTTP 接入点(内网和公网)。

  2. 确保 SDK 中配置的接入点和控制台提供的一致。

  3. 有命名空间的实例,需在 SDK 中配置 instanceId,否则无法正确路由到目标 Topic。

  4. 客户端部署在 VPC 外时,使用公网接入点;内网接入点仅 VPC 内可达。

TBW102 和 RMQ_SYS_TRACE_TOPIC 处理

以下两个 Topic 为系统内置,出现 No route info 时按以下方式处理:

  • TBW102:系统内置 Topic,在 4.x 云上实例中不存在。发送消息时如提示 No route info for TBW102,可忽略,无需排查。

  • RMQ_SYS_TRACE_TOPIC:消息轨迹 Topic,用于记录消息轨迹数据。未启用消息轨迹时不会创建该 Topic,因此报 No route info 属正常现象;启用消息轨迹后,需配置云上轨迹兼容,使客户端正确路由到该 Topic。

网络连通性排查

网络层面的连通性问题也会导致 No route info,建议按以下顺序排查:

  1. 查看客户端日志(rocketmq_client.logons.log),确认是否存在网络连接异常记录。

  2. 使用 ping 命令检测接入点域名的可达性。内网接入点从 VPC 外访问时不可达,此时需切换为公网接入点。

  3. 使用 telnetnc 命令检测接入点端口的连通性,确认客户端到 Name Server 的网络链路正常。

若客户端报错信息中包含 Name or service not known,说明域名解析失败,属于网络问题:请检查代码中配置的接入点域名是否正确、客户端所在网络的 DNS 解析和出网连接是否通畅。

ACL 鉴权排查

命名空间实例的 Topic 访问涉及 ACL 鉴权,权限配置错误也会导致无法获取路由信息:

  1. Topic 管理页面对应 Topic 的操作列,单击权限参考查看当前 ACL 配置。

  2. 根据实例是否配置了命名空间,检查对应的 ACL 权限策略是否正确。

  3. 确认 SDK 中使用的 AccessKey 拥有目标 Topic 的访问权限。

若客户端报错信息中包含 AccessDenied 且提示 OwnerId forbidden,说明鉴权失败:请检查 SDK 中配置的 AccessKeySecretKey 是否正确、是否与目标实例所属账号匹配。

spring-cloud-stream 框架适配

使用 spring-cloud-stream 框架接入有命名空间的实例时,Topic 命名格式与直接使用 SDK 不同:Topic 需配置为 instanceId%topic 格式(例如 MQ_INST_xxx%topic-name),instanceId 和 Topic 需作为一个整体传递,否则命名空间实例下的 Topic 访问会因缺少 instanceId 上下文而报错。

Serverless 实例公网接入

Serverless 实例仅在 5.0 系列中提供,使用早于 5.0 系列的 SDK 无法正常接入。通过公网接入 Serverless 实例时:

  • 使用指定版本的 5.0 系列 SDK,SDK 版本不匹配会导致无法正确路由到目标 Topic。

  • 在 SDK 中设置对应的命名空间(namespace),未设置命名空间会导致 Topic 路由信息获取失败,提示 No route info。