MQTT Part 8 保留消息

本文翻譯自http://www.hivemq.com/blog/mqtt-essentials-part-8-retained-messages

未經(jīng)允許,不得轉(zhuǎn)載

當發(fā)布MQTT消息時,發(fā)布者不能確保消息被訂閱者收到。它只能確認消息被安全地投遞到broker。同樣的訂閱者也如此,如果訂閱者連上broker并且訂閱了它感興趣的主題,我們沒有辦法保證訂閱者何時才能收到第一條消息,因為這完全取決于該主題的發(fā)布者。等待發(fā)布者發(fā)布消息可能需要幾秒鐘,幾分鐘甚至幾個小時。而這期間,訂閱者對于當前的狀態(tài)一無所知。而此時就是保留消息發(fā)揮作用的時候了。

保留消息

保留消息是一條將保留標志(retained flag)置為true的普通MQTT消息。broker會針對主題依照QoS級別保留最后一條保留消息,當訂閱者訂閱主題時會立即收到保留消息。broker僅為每個主題保留一條保留消息。
訂閱者不需要明確指定主題,即便以通配符訂閱主題也會收到保留消息。例如客戶端A向myhome/livingroom/temperature主題發(fā)布了保留消息,稍后客戶端B訂閱了myhome/#主題,那么客戶端B會在訂閱后直接收到此條保留消息。訂閱者也可以識別出收到的消息是否為保留消息,因為broker在發(fā)送保留消息時保留標志(retained flag)仍為true??蛻舳丝梢詻Q定如何處理此條消息。
所以保留消息可以幫助新的訂閱者在訂閱主題后立即獲取當前狀態(tài),而無須等待發(fā)布者發(fā)送下一條更新。
換句話說,一個主題的保留消息是最新的可知的有效數(shù)據(jù),它不必是最新的數(shù)據(jù),但它確實是將保留標志置為true的最新消息。
還有一點很重要,我們要理解保留消息和我們上節(jié)提到的持久會話無關(guān),一旦保留消息被存儲,將其移除的唯一方式就是下面所提到的辦法。

發(fā)送一條保留消息

從開發(fā)者的角度來說,發(fā)送一條保留消息是最簡單直接的辦法。你只需要將一條MQTT發(fā)布消息的保留標志(retained flag)置為true。每一個典型的客戶端庫文件都提供了一個簡單方法來實現(xiàn)此操作。

刪除一條保留消息

還有一種很簡單的方法來刪除某個主題的保留消息:只需要發(fā)送一個零字節(jié)的保留消息到你想清空消息的主題。broker將會刪除保留消息,并且訂閱者也不會再收到保留消息,因為每個新的保留消息都會覆蓋上一個。

什么情況下應(yīng)該使用保留消息?

保留消息存在的意義是為了訂閱者能夠立即收到消息而無須等待發(fā)布者發(fā)布下一條消息。這在那些指示設(shè)備或者組件狀態(tài)的主題上非常有用。例如,設(shè)備1的狀態(tài)對應(yīng)主題myhome/devices/device1/status,當使用保留消息時,此主題的一個新訂閱者在訂閱后會立即收到設(shè)備的當前狀態(tài)。對于那些周期性地發(fā)送數(shù)據(jù),如溫度,GPS坐標或其他數(shù)據(jù)的客戶端也一樣。如果不使用保留信息,訂閱者在發(fā)布者發(fā)送間隔期將對當前狀態(tài)一無所知。而使用保留信息可以立即提供一個有效數(shù)據(jù)給新客戶端。

最后編輯于
?著作權(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)容