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)
- publisher store msg -> publish ->broker (傳遞message)
- broker -> puback -> publisher delete msg (確認傳遞成功)
注意:
- publisher必須保存msg,這樣才能在重發
- 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