MQTT協議學習筆記——Qos深入分析

1、簡單介紹

(1)所謂的“Qos”——“quality of service”,即 “質量服務”。

質量:通訊質量,即 “消息的可靠性”。
服務:保證消息可靠的機制。

(2)Qos等級

Qos=0,發送者最多發送一次消息(最多一次);

Qos=1,發送者最少發送一次消息,即接收者可能會收到同一條消息好幾次(最少一次);

Qos=2,發送者發送一次“被接收者接收一次“的消息(有且只有一次)。

2、深入思考

(1)Qos=0

發送者只發送一次消息,不進行重試,不關心消息是否已經投遞到了接收者那邊。Broker不會返回確認消息。在Qos0情況下,Broker可能沒有接受到消息。適合那些不是很重要的數據。

(2)Qos=2

發送者最少發送一次消息,確保消息到達Broker,Broker需要返回確認消息PUBACK。在Qos1情況下,Broker可能接受到重複消息。儘管我們可以通過確認來保證一定收到客戶端或服務器的message,但是我們卻不能保證message僅有一次,也就是當client沒收到service的puback或者service沒有收到client的puback,那麼就會一直髮送publisher。

流程:(publisher -> broker)

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

注意:

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

(3)Qos=2

Qos2使用兩階段確認來保證消息的不丟失和不重複。在Qos2情況下,Broker肯定會收到消息,且只收到一次。

主要過程:publisher和broker進行了緩存,其中publisher緩存了message和msgID,而broker緩存了msgID,兩方都做記錄所以可以保證消息不重複,但是由於記錄是需要刪除的,這個刪除流程同樣多了一倍。

與Qos1相比,Qos2的開銷會很大,因爲Broker有額外的兩個動作:

   *去重。爲了保證消息不重複,Broker必須進行去重處理;
   * 確保響應消息PUBREC到達客戶端。Broker必須等待客戶端對PUBREC消息的響應PUBREL,只有收到客戶端的確認消息後,Broker才能對訂閱者投遞消息。

(4)總結

QoS 級別越高,流程越複雜,系統資源消耗越大。應用程序可以根據自己的網絡場景和業務需求,選擇合適的 QoS 級別;

大部分情況下使用Qos=0或Qos=1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章