MQTT作為一個(gè)IOT領(lǐng)域常用的通信框架,本身是基于TCP的,有丟包重傳、流量控制、擁塞檢測(cè)等機(jī)制,算是比較穩(wěn)定的。但實(shí)際開(kāi)發(fā)過(guò)程中,由于代碼邏輯問(wèn)題或者對(duì)MQTT本身機(jī)制不夠了解了解導(dǎo)致的斷連、丟包等問(wèn)題屢見(jiàn)不鮮。本人在實(shí)際開(kāi)發(fā)中也遇到了一些相關(guān)問(wèn)題,這里記錄下來(lái)以供他們參考
一、斷連問(wèn)題
1.clientId 重復(fù)
對(duì)于MQTT來(lái)說(shuō),是不允許多個(gè)連接使用同一個(gè) clientId的,如果使用了同一個(gè),會(huì)強(qiáng)制斷開(kāi)舊的連接。因此在使用mqtt 框架的時(shí)候,最好是用單例封裝一下,保證外部調(diào)用時(shí)不會(huì)實(shí)例化多個(gè)連接,同時(shí)內(nèi)部也要注意在單例初始化的時(shí)候就要?jiǎng)?chuàng)建好連接對(duì)象,避免發(fā)起連接時(shí)再創(chuàng)建連接對(duì)象從而導(dǎo)致重復(fù)。
2. 證書(shū)失效
對(duì)于使用了SSL的MQTT連接來(lái)說(shuō),需要特別注意證書(shū)的有效性,本人之前做的項(xiàng)目SSL證書(shū)是動(dòng)態(tài)生成的,因此在APP啟動(dòng)、登陸等環(huán)節(jié)都要去更新一下證書(shū),以避免證書(shū)失效導(dǎo)致的連接斷開(kāi)。
3. 權(quán)限問(wèn)題
本人之前使用的是AWS的MQTT服務(wù),對(duì)于每個(gè)topic的發(fā)布和訂閱都有權(quán)限管理,因此如果連不上,需要查看下是否權(quán)限配置正確了。對(duì)于動(dòng)態(tài)添加的權(quán)限,還需要更新證書(shū)和重新建立連接來(lái)保證權(quán)限可用。
二、丟包問(wèn)題
1. 訂閱消息過(guò)多
訂閱過(guò)多的主題會(huì)降低服務(wù)器性能,導(dǎo)致消息處理不及時(shí)而丟棄或延遲,因此最好在業(yè)務(wù)不需要的時(shí)候取消訂閱那些可有可無(wú)的主題
2. QOS 設(shè)置不合理
QOS 有三個(gè)級(jí)別,最常用的是0(最多發(fā)送一次)和1 (最少發(fā)送一次),一般出于性能考慮能用0的盡量用0 ,但對(duì)于特別重要的消息,最好使用1或2(只發(fā)送一次)。有些服務(wù)器不支持QOS2 的,就只能用1.
3. 建立連接前或連接已斷開(kāi)
這個(gè)時(shí)候顯然是無(wú)法發(fā)送和接收消息的,所以在訂閱和發(fā)布前應(yīng)判斷當(dāng)前連接的狀態(tài),如果是未連接或已斷開(kāi),則需要先建立連接再發(fā)送和訂閱消息。