QOS質(zhì)量服務等級
什么是質(zhì)量服務等級(Quality of Servicce)?
MQTT協(xié)議設計初衷是提供一套保證消息穩(wěn)定傳輸?shù)臋C制,用于網(wǎng)絡帶寬窄,信號不穩(wěn)定環(huán)境下的數(shù)據(jù)傳輸,這套機制包括消息應答,存儲和重傳。MQTT服務質(zhì)量用于告知物聯(lián)網(wǎng),哪些信息比較重要,哪些信息沒那么重要,將信息按照不同的QOS等級進行傳輸。
MQTT消息質(zhì)量有三個等級,QoS 0,QoS 1和?QoS 2。
QoS 0:最多發(fā)一次,占用資源最少。
QoS 1:最少發(fā)一次,但消息可能會重復。
QoS 2:保證收一次,但是所需時間長。
QOS 0:
消息的傳遞完全依賴底層的TCP/IP網(wǎng)絡,協(xié)議里沒有定義應答和重試,消息要么只會到達服務端一次,要么根本沒有到達。
MQTT服務端和客戶端不會對消息傳輸是否成功進行確認和檢查,消息能否傳輸成功全看網(wǎng)絡環(huán)境是否穩(wěn)定。
QOS 1:
發(fā)送端在消息發(fā)送完成后,會檢查接收端是否已經(jīng)成功接收到了消息。
服務器的消息接收由PUBACK消息進行確認,如果通信鏈路或發(fā)送設備異常,或者指定時間內(nèi)沒有收到確認消息,發(fā)送端會重發(fā)這條在消息頭中設置了DUP位的消息,信息傳輸有保障,但是消息可能會重復。?

QOS 2:
發(fā)送端發(fā)送信息之后,需要接受端2次確認。這是最高級別的消息傳遞,消息丟失和重復都是不可接受的,使用這個服務質(zhì)量等級會有額外的開銷,時間也是最慢的。

QOS設置
發(fā)布消息:發(fā)布信息時,PUBLISH數(shù)據(jù)包中將qos設置為對應的等級。
訂閱消息:訂閱主題時,SUBSCRIBE數(shù)據(jù)包中設置對應的qos級別。
接收端連接服務端:連接請求CONNECT--cleanSession設置為false (qos=1/2 ; qos=0無需設置,默認即可)。
若客戶端A發(fā)送給服務端Qos=2,服務端發(fā)送給客戶端B的Qos=1,這時服務端會用較低級別來提供服務即服務質(zhì)量降級(服務端會主動采用低級別的Qos進行消息傳輸)。


小結(jié)
● 若想實現(xiàn)QoS>o,訂閱端連接服務端時cleanSession需要設置為false,訂閱端訂閱主題時,QoS>o,發(fā)布端發(fā)布消息時的QoS>o。
● 服務端會選擇發(fā)布消息和訂閱消息中較低的QoS來實現(xiàn)消息傳輸,這也被稱作"服務降級"。
● QoS=o,占用的網(wǎng)絡資源最低,但是接收端可能會出現(xiàn)無法接收消息的情況,所以適用于傳輸重要性較低的信息。
● QoS=1,MQTT會確保接收端能夠接收到消息,但是有可能出現(xiàn)接收端反復接收同一消息的情況。
● QoS=2,MQTT會確保接收端只接收到一次消息。但是QoS為2時消息傳輸最慢,另外消息傳輸需要多次確認,因此所占用的網(wǎng)絡資源也是最多的,此類服務等級適用于重要消息傳輸。
● 由于QoS1和QoS2都能確保客戶端接收到消息,但是QoS1所占用的資源較QoS2占用資源更小。因此建議使用QoS1來實現(xiàn)網(wǎng)絡資源較為珍貴的環(huán)境下傳輸重要信息。