MQTT與RocketMQ的消息結(jié)構(gòu)映射
本文針對(duì)使用云消息隊(duì)列 RocketMQ 版SDK與云消息隊(duì)列 MQTT 版交互的場(chǎng)景,提供交互中所涉及的消息結(jié)構(gòu)和屬性字段的映射關(guān)系,方便您更好的理解和組合使用這兩個(gè)產(chǎn)品。
云消息隊(duì)列 MQTT 版是一款面向移動(dòng)端的網(wǎng)關(guān)產(chǎn)品,可通過數(shù)據(jù)互通規(guī)則實(shí)現(xiàn)與其他阿里云產(chǎn)品,例如云消息隊(duì)列 RocketMQ 版的交互。規(guī)則的詳細(xì)信息,請(qǐng)參見規(guī)則管理。
如果單獨(dú)使用云消息隊(duì)列 MQTT 版,則無(wú)需關(guān)注本文提供的映射關(guān)系,一切遵循標(biāo)準(zhǔn)MQTT協(xié)議規(guī)范即可。
云消息隊(duì)列 MQTT 版的詳細(xì)介紹,請(qǐng)參見什么是云消息隊(duì)列 MQTT 版和名詞解釋。
消息結(jié)構(gòu)映射
云消息隊(duì)列 MQTT 版和云消息隊(duì)列 RocketMQ 版都是基于發(fā)布/訂閱(Pub/Sub)模型的消息系統(tǒng),兩者概念上存在很多相似之處,下圖列舉了關(guān)鍵概念的區(qū)別和映射關(guān)系。
如上圖所示,在云消息隊(duì)列 MQTT 版中Topic是多級(jí)結(jié)構(gòu),而云消息隊(duì)列 RocketMQ 版的Topic僅有一級(jí),因此,云消息隊(duì)列 MQTT 版中的一級(jí)Topic映射到云消息隊(duì)列 RocketMQ 版的Topic,而子級(jí)Topic,包括二級(jí)、三級(jí)、n級(jí)Topic則映射到云消息隊(duì)列 RocketMQ 版的消息屬性(Properties)中。
云消息隊(duì)列 RocketMQ 版協(xié)議中的消息(Message)可以擁有自定義屬性(Properties),而MQTT協(xié)議目前的版本不支持屬性,但為了方便溯源MQTT協(xié)議中的Header信息和設(shè)備信息,云消息隊(duì)列 MQTT 版的部分信息將被映射到云消息隊(duì)列 RocketMQ 版的消息屬性中,方便使用云消息隊(duì)列 RocketMQ 版的SDK接入的用戶獲取。
在云消息隊(duì)列 RocketMQ 版中設(shè)置屬性字段來(lái)映射云消息隊(duì)列 MQTT 版的具體步驟,請(qǐng)參見下文屬性字段映射的表格。
云消息隊(duì)列 RocketMQ 版和云消息隊(duì)列 MQTT 版的消息負(fù)載(Payload)均是您的業(yè)務(wù)消息的數(shù)據(jù)序列化結(jié)果,云消息隊(duì)列 RocketMQ 版和云消息隊(duì)列 MQTT 版不會(huì)對(duì)業(yè)務(wù)消息再做進(jìn)一步的編解碼處理。
屬性字段映射
目前,云消息隊(duì)列 MQTT 版和云消息隊(duì)列 RocketMQ 版支持的屬性字段映射關(guān)系如下表所示。使用云消息隊(duì)列 RocketMQ 版和云消息隊(duì)列 MQTT 版的SDK的應(yīng)用交互時(shí),可以通過讀寫這些屬性字段來(lái)設(shè)置或獲取信息。
QoS、cleanSession、Topic以及Client ID的詳細(xì)解釋,請(qǐng)參見名詞解釋。
MQTT參數(shù) | RocketMQ屬性Key | 屬性可選值 | 說明 |
QoS | qoslevel | 0、1、2 | 云消息隊(duì)列 RocketMQ 版發(fā)給云消息隊(duì)列 MQTT 版消息時(shí)可以設(shè)置,如果不設(shè)置,默認(rèn)為“1”; 云消息隊(duì)列 MQTT 版發(fā)給云消息隊(duì)列 RocketMQ 版的消息可以直接讀取。 |
MQTT全量Topic | topic | 具體的全量Topic字符串 | 不可設(shè)置,云消息隊(duì)列 MQTT 版發(fā)給云消息隊(duì)列 RocketMQ 版消息時(shí),用于追蹤該消息的發(fā)送源的全量Topic。 |
cleanSession | cleansessionflag | true、false | 云消息隊(duì)列 RocketMQ 版發(fā)給云消息隊(duì)列 MQTT 版客戶端P2P消息時(shí)設(shè)置,如不設(shè)置,默認(rèn)為“true”; 其他消息不可以設(shè)置,云消息隊(duì)列 MQTT 版發(fā)給云消息隊(duì)列 RocketMQ 版的消息可以直接讀取。 |
MQTT子級(jí)Topic | mqttSecondTopic | 具體的子級(jí)Topic字符串 | 云消息隊(duì)列 RocketMQ 版發(fā)給云消息隊(duì)列 MQTT 版客戶端消息時(shí)如果需要子級(jí)Topic來(lái)做過濾,則設(shè)置,如不設(shè)置,默認(rèn)為空; 云消息隊(duì)列 MQTT 版發(fā)給云消息隊(duì)列 RocketMQ 版的消息可以直接讀取。 |
客戶端接收消息顯示Topic | mqttRealTopic | 業(yè)務(wù)上希望客戶端收到消息時(shí)顯示的子級(jí)字符串 | 云消息隊(duì)列 RocketMQ 版發(fā)給云消息隊(duì)列 MQTT 版客戶端消息時(shí)如果希望客戶端收到消息后顯示成指定的子級(jí)Topic名稱,則可以設(shè)置;一般用于P2P消息,若不設(shè)置,P2P消息默認(rèn)使用自己固定的Topic; 云消息隊(duì)列 MQTT 版發(fā)給云消息隊(duì)列 RocketMQ 版的消息時(shí)無(wú)該屬性。 |
clientId | clientId | 具體的Client ID字符串 | 不可設(shè)置,云消息隊(duì)列 MQTT 版發(fā)給云消息隊(duì)列 RocketMQ 版消息時(shí),用于追蹤該消息的發(fā)送源的Client ID。 |