1.QoS含義 :
Quality of Service,服務質量
2.作用域
發布者的Qos
訂閱者的Qos
3.等級與作用
level 0:最多一次的傳輸
level 1:至少一次的傳輸,(雞肋)
level 2: 只有一次的傳輸
4.交互過程
qos0
對于qos1而言,對于client而言,有且僅發一次publish包,對于broker而言,有且僅發一次publish,簡而言之,就是僅發一次包,是否收到完全不管,適合那些不是很重要的數據。
qos0.png
qos1
對于qos0而言,這個交互就是多了一次ack的作用,但是會有個問題,盡管我們可以通過確認來保證一定收到客戶端或服務器的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
qos1.png
qos2
對于qos1而言,qos2可以實現僅僅接受一次message,其主要原理(對于publisher而言),
publisher和broker進行了緩存,其中publisher緩存了message和msgID,而broker緩存了msgID,兩方都做記錄所以可以保證消息不重復,但是由于記錄是需要刪除的,這個刪除流程同樣多了一倍
流程:(publisher -> broker)
- publisher store msg -> publish ->broker -> broker store msgID(傳遞message)
- broker -> puberc (確認傳遞成功)
- publisher -> pubrel -> broker delete msgID (告訴broker刪除msgID)
- broker -> pubcomp -> publisher delete msg (告訴publisher刪除msg)
注意:
- 第二步,即puberc不可以刪除 publisher的msg,因為第三步未必成功,這個時候就需要第一步提醒第二步繼續發,而提醒必須要msgID
qos2.png
5.問題
1.為什么 qos2不是3次,不和tcp握手一致
2.Qos對協議的影響