華為云計(jì)算 云知識(shí) 華為云物聯(lián)網(wǎng)平臺(tái)設(shè)備級(jí)消息上下行保序方案
華為云物聯(lián)網(wǎng)平臺(tái)設(shè)備級(jí)消息上下行保序方案

場(chǎng)景說(shuō)明

華為云設(shè)備接入IoTDA服務(wù)在滿足高可靠、高并發(fā)的同時(shí)可按需開(kāi)啟設(shè)備維度的消息上下行保序功能。本文以MQTT協(xié)議為例介紹基于IoTDA的上、下行消息的保序方案。

場(chǎng)景說(shuō)明

典型如車(chē)聯(lián)網(wǎng)場(chǎng)景中:高速行駛中的車(chē)輛會(huì)實(shí)時(shí)上報(bào)自身的GPS位置數(shù)據(jù)(通常1~5秒/條數(shù)據(jù)),IoT平臺(tái)接收該數(shù)據(jù)并轉(zhuǎn)發(fā)給云端應(yīng)用,應(yīng)用側(cè)根據(jù)上報(bào)的位置數(shù)據(jù)繪制實(shí)時(shí)軌跡地圖,車(chē)輛端上報(bào)的軌跡點(diǎn)依次為:A點(diǎn)——>B點(diǎn)——>C點(diǎn),在亂序情況下,應(yīng)用側(cè)接收到的軌跡點(diǎn)可能會(huì)為:B點(diǎn)——>A點(diǎn)——>C點(diǎn),從而導(dǎo)致繪制的軌跡地圖與真實(shí)軌跡不符。

上行消息保序

在需要上行消息保序的場(chǎng)景,可以參考如下圖的方案進(jìn)行設(shè)計(jì):

圖1 設(shè)計(jì)方案
  • 設(shè)備-平臺(tái):設(shè)備側(cè)上報(bào)消息時(shí),Qos值設(shè)置為1,上報(bào)消息A后,等收到消息A的Qos響應(yīng)后,再依次上報(bào)消息B和消息C,從而保證設(shè)備與平臺(tái)側(cè)的消息上行保序。

  • 平臺(tái)-應(yīng)用:IoTDA配置數(shù)據(jù)流轉(zhuǎn)規(guī)則為流轉(zhuǎn)到Kafka,當(dāng)開(kāi)啟IoTDA的消息保序功能后,IoTDA會(huì)將同一個(gè)設(shè)備的消息推送到Kafka的同一個(gè)partition,從而實(shí)現(xiàn)平臺(tái)與應(yīng)用端的轉(zhuǎn)發(fā)保序。

  • 應(yīng)用服務(wù)器消費(fèi)Kafka數(shù)據(jù)時(shí),同一個(gè)設(shè)備的消息會(huì)分發(fā)到同一個(gè)消費(fèi)者,消費(fèi)者可以按順序消費(fèi)設(shè)備依次上傳上來(lái)的數(shù)據(jù)。

下行消息保序

在需要下行消息保序的場(chǎng)景,可以參考如下圖的方案進(jìn)行設(shè)計(jì):

  • 應(yīng)用平臺(tái)調(diào)用同步命令接口下發(fā)命令A(yù)。

  • IoTDA收到同步命令A(yù)的請(qǐng)求后,會(huì)將命令轉(zhuǎn)換為MQTT消息下發(fā)給設(shè)備,下發(fā)請(qǐng)求后平臺(tái)會(huì)阻塞等待,等待設(shè)備返回命令A(yù)的執(zhí)行結(jié)果。

  • 設(shè)備收到命令A(yù)的請(qǐng)求,執(zhí)行完對(duì)應(yīng)操作后,返回命令A(yù)的響應(yīng)。

  • IoTDA收到命令A(yù)的響應(yīng)后返回命令結(jié)果給應(yīng)用側(cè)。
  • 應(yīng)用平臺(tái)收到命令A(yù)的響應(yīng)后再下發(fā)命令B。

須知:通過(guò) 物聯(lián)網(wǎng)平臺(tái) 實(shí)現(xiàn)消息保序會(huì)對(duì)整體性能略有影響, IoTDA默認(rèn)關(guān)閉該功能,如有需求請(qǐng)?zhí)峁巫稍?,?dāng)前僅企業(yè)版支持開(kāi)啟該功能。