情境描述
通過RocketMQ SDK接入雲訊息佇列 RocketMQ 版時報錯No route info。
適用SDK
商業版 HTTP SDK(僅訊息佇列RocketMQ 4.0系列執行個體支援。詳見各版本SDK說明)
商業版1.x SDK(Java, Remoting協議),依賴座標範例(商業版SDK版本必須大於1.7.9):
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>ons-client</artifactId> <version>1.9.1.Final</version> </dependency>開源SDK(Java,Remoting協議,artifactId為rocketmq-client),依賴範例座標(開源SDK版本必須大於4.5.2,請檢查代碼配置和SDK版本):
<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.9.2</version> </dependency>
簡要排查思路
根據執行個體系列以及SDK協議、語言的不同組合,會有不同的排查方式,需要根據具體情境進行排查。
排查詳情
HTTP協議SDK
核實代碼中配置的存取點與需要接入的目標執行個體的控制台顯示的存取點是否一致,一致的話檢查Topic是否建立。
檢查執行個體詳情頁是否存在命名空間,有命名空間的執行個體的生產/消費代碼中需要配置 instanceId,詳見程式碼範例。無命名空間執行個體instanceId則需要傳入null空值或字串空值。

TCP Remoting協議 SDK
確認報錯
no router info的資源是否為TBW102或者RMQ_SYS_TRACE_TOPIC。TBW102:是開源RocketMQ用來自動建立Topic使用的,雲訊息佇列 RocketMQ 版的Topic是管控資源,無法自動建立,且TBW102不會影響用戶端正常使用,可以忽略。
RMQ_SYS_TRACE_TOPIC:開源RocketMQ用來上報訊息軌跡的Topic,在接入雲訊息佇列 RocketMQ 版需要配置雲上軌跡相容,開源Remoting協議SDK(artifactId為rocketmq-client)可以通過以下方式配置,詳見收發普通訊息(三種方式)。
public static void main(String[] args) throws MQClientException { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("YOUR GROUP ID", getAclRPCHook(), new AllocateMessageQueueAveragely(), true, null); consumer.setNamesrvAddr("http://xxxx.mq-internet.aliyuncs.com:80"); //阿里雲上訊息軌跡需要設定為CLOUD方式,在使用雲上訊息軌跡的時候,需要設定此項,如果不開啟訊息軌跡功能,則運行不設定此項。 consumer.setAccessChannel(AccessChannel.CLOUD); ...... consumer.start(); }
核實代碼中配置的存取點與需要接入的目標執行個體的控制台顯示的存取點是否一致,一致的話檢查Topic是否建立。
在Java Remoting協議用戶端,可以查看用戶端日誌中是否存在網路連接異常,日誌路徑:
開源社區Java SDK路徑
/{user.home}/logs/rocketmqlogs/rocketmq_client.log商業1.x版本路徑
/{user.home}/logs/ons.log。
如果日誌中存在網路連接異常問題需要先保證網路暢通,可以通過
ping以及telnet命令來檢測。需要注意這裡不能僅通過telnet測試與存取點的網路連接,還需要看日誌中報錯的地址是什麼,然後通過telnet測試與日誌中報錯地址的網路連接。查看日誌中是否存在鑒權失敗問題,若存在鑒權失敗問題需要先解決許可權問題然後再查看是否還有報錯。
4.0系列執行個體參考雲訊息佇列 RocketMQ 版自訂權限原則,在授權的時候需要根據執行個體是否存在命名空間選擇具體的策略。
5.0系列執行個體參考為ACL使用者授權授予對應的acl許可權即可。判斷執行個體是否存在命名空間可參考HTTP協議SDK中的說明。
核實是否有使用spring-cloud-stream架構,詳見配置說明。
如果執行個體詳情頁存在命名空間,則Topic需要配置
執行個體id%Topic。如果執行個體詳情頁不存在命名空間,則配置Topic名稱即可。判斷執行個體是否存在命名空間可參考HTTP協議SDK中的說明。
核實是否通過公網接入Serverless執行個體。
通過公網接入Serverless執行個體需要使用指定版本的SDK以及設定命名空間。
通過內網接入Serverless執行個體,或者通過公網/內網接入其他類型的5.0系列執行個體則不需要設定命名空間。
// SDK版本支援:rocketmq-client >= 5.2.0版 producer.setNamespaceV2("rmq-cn-xxxxxxx"); consumer.setNamespaceV2("rmq-cn-xxxxxxx"); // SDK版本支援:rocketmq-client-java >= 5.0.6版 StaticSessionCredentialsProvider staticSessionCredentialsProvider = new StaticSessionCredentialsProvider("存取控制頁擷取使用者資訊", “存取控制頁擷取”); //在RocketMQ 存取控制頁面擷取使用者名稱和密碼 ClientConfiguration clientConfiguration = ClientConfiguration.newBuilder() .setEndpoints("rmq-cn-xxxxxxx.cn-hangzhou.rmq.aliyuncs.com:8080") .setNamespace("rmq-cn-xxxxxxx") .setCredentialProvider(staticSessionCredentialsProvider) .build(); // ons >= 1.9.0.Final properties.setProperty(PropertyKeyConst.Namespace, "rmq-cn-xxxxxxx");