MQTT三種等級的服務質量實現

MQTT提供三種等級的服務質量,它們分別是:
1、最多一次,盡操作環境所能提供的最大努力分發消息。消息可能會丟失。
2、至少一次,保證消息可以到達,但是可能會重複。
3、僅一次,保證消息只到達一次。

一、最多一次:
在這裏插入圖片描述
如上圖所示,這個等級,只需要而且是隻能將消息發佈一次。因爲這個等級是允許消息丟失,但不允許消息重複的。

二、至少一次
在這裏插入圖片描述
如上圖所示,爲了確保消息至少送達一次,我們需要將消息暫存起來,並且每隔一段時間要進行一次重發,直到我們收到接收端的回覆爲止,這時我們才刪除暫存的消息,並停止重複發送消息。對於接收端,則需要在每次收到消息後都進行一個回覆。另外值得注意的是,上圖中publisher到broker和broker到subscriber是同等的,兩段通信都應按以上討論的進行實現。

三、僅一次
在這裏插入圖片描述
通訊過程如上圖所示。這裏同樣publisher到broker和broker到subscriber是同等的,所以我們下面就以發送端、接收端來進行描述。
1、首先發送端收到消息後,將消息暫存起來。
2、發送消息到接收端,並且在收到接收端的回覆(pubrec)之前,每隔一段時間都重複發送一次消息,這樣確保接收端一定接收到消息。
3、接收端收到消息後,也將消息暫存起來,並且將消息給上層應用,這之後再接收到此條消息就丟棄掉,因爲經過和暫存中的消息比對,發現已經收到過故此就丟棄。
4、接收端發送一個發佈收到(pubrec)的消息給發送端,由於發送端也有可能收不到這個消息,所以在收到發送端發過來的發佈釋放(pubrel)消息之前,每隔一段時間重複發送該消息。
5、發送端收到pubrec後,停止重複發送消息,因爲它已經確定接收到收到消息了,並且給接收端發送一個pubrel。
6、刪除暫存的消息,之後發送端每次收到pubrec都直接發送一個pubrel消息給接收端。
7、接收端在收到pubrel消息後,修改暫存的消息狀態爲發佈完成,停止發送pubrec,然後給發送端發去一個發佈完成(pubcomp)的消息。
8、接收端刪除暫存的消息,之後每次收到pubrel都直接回復pubcomp。
9、發送端收到pubcomp,如果發現暫存的消息還每刪除的話,就刪除暫存消息,如果已經刪除了就不管了。

在這個過程中,爲啥接收端要暫存消息,主要是爲了在接收到重複消息的時候有一個去重的依據。在接收到pubrel後,就能確定發送端不再會發送消息,所以這個時候就可以刪除暫存消息了。同樣的,發送端在接收到pubrec後知道接收端已經接收到消息了,所以不必再發送消息,並且可以刪除暫存了。

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