Mqtt Qos 深度解讀

1.QoS含義 :

Quality of Service,服務(wù)質(zhì)量

2.作用域

發(fā)布者的Qos
訂閱者的Qos

3.等級與作用

level 0:最多一次的傳輸
level 1:至少一次的傳輸,(雞肋)
level 2: 只有一次的傳輸

4.交互過程

qos0

對于qos1而言,對于client而言,有且僅發(fā)一次publish包,對于broker而言,有且僅發(fā)一次publish,簡而言之,就是僅發(fā)一次包,是否收到完全不管,適合那些不是很重要的數(shù)據(jù)

qos0.png

qos1

對于qos0而言,這個交互就是多了一次ack的作用,但是會有個問題,盡管我們可以通過確認(rèn)來保證一定收到客戶端或服務(wù)器的message,但是我們卻不能保證message僅有一次,也就是當(dāng)client沒收到service的puback或者service沒有收到client的puback,那么就會一直發(fā)送publisher

流程:(publisher -> broker)

  1. publisher store msg -> publish ->broker (傳遞message)
  2. broker -> puback -> publisher delete msg (確認(rèn)傳遞成功)

注意:

  1. publisher必須保存msg,這樣才能在重發(fā)
  2. publisher如果在一定時間或socket斷開等異常情況,會繼續(xù)重發(fā)msg
qos1.png

qos2

對于qos1而言,qos2可以實現(xiàn)僅僅接受一次message,其主要原理(對于publisher而言),
publisher和broker進行了緩存,其中publisher緩存了message和msgID,而broker緩存了msgID,兩方都做記錄所以可以保證消息不重復(fù),但是由于記錄是需要刪除的,這個刪除流程同樣多了一倍

流程:(publisher -> broker)

  1. publisher store msg -> publish ->broker -> broker store msgID(傳遞message)
  2. broker -> puberc (確認(rèn)傳遞成功)
  3. publisher -> pubrel -> broker delete msgID (告訴broker刪除msgID)
  4. broker -> pubcomp -> publisher delete msg (告訴publisher刪除msg)

注意:

  1. 第二步,即puberc不可以刪除 publisher的msg,因為第三步未必成功,這個時候就需要第一步提醒第二步繼續(xù)發(fā),而提醒必須要msgID
qos2.png

5.問題

1.為什么 qos2不是3次,不和tcp握手一致

2.Qos對協(xié)議的影響

6.參考

qos等級
qos交互過程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容