本文翻譯自http://www.hivemq.com/blog/mqtt-essentials-part-8-retained-messages
未經(jīng)允許,不得轉(zhuǎn)載
當(dāng)發(fā)布MQTT消息時淹禾,發(fā)布者不能確保消息被訂閱者收到馁菜。它只能確認(rèn)消息被安全地投遞到broker。同樣的訂閱者也如此铃岔,如果訂閱者連上broker并且訂閱了它感興趣的主題汪疮,我們沒有辦法保證訂閱者何時才能收到第一條消息,因為這完全取決于該主題的發(fā)布者毁习。等待發(fā)布者發(fā)布消息可能需要幾秒鐘智嚷,幾分鐘甚至幾個小時。而這期間纺且,訂閱者對于當(dāng)前的狀態(tài)一無所知纤勒。而此時就是保留消息發(fā)揮作用的時候了。
保留消息
保留消息是一條將保留標(biāo)志(retained flag)置為true的普通MQTT消息隆檀。broker會針對主題依照QoS級別保留最后一條保留消息摇天,當(dāng)訂閱者訂閱主題時會立即收到保留消息。broker僅為每個主題保留一條保留消息恐仑。
訂閱者不需要明確指定主題泉坐,即便以通配符訂閱主題也會收到保留消息。例如客戶端A向myhome/livingroom/temperature主題發(fā)布了保留消息裳仆,稍后客戶端B訂閱了myhome/#主題腕让,那么客戶端B會在訂閱后直接收到此條保留消息。訂閱者也可以識別出收到的消息是否為保留消息,因為broker在發(fā)送保留消息時保留標(biāo)志(retained flag)仍為true纯丸∑危客戶端可以決定如何處理此條消息。
所以保留消息可以幫助新的訂閱者在訂閱主題后立即獲取當(dāng)前狀態(tài)觉鼻,而無須等待發(fā)布者發(fā)送下一條更新俊扭。
換句話說,一個主題的保留消息是最新的可知的有效數(shù)據(jù)坠陈,它不必是最新的數(shù)據(jù)萨惑,但它確實是將保留標(biāo)志置為true的最新消息。
還有一點很重要仇矾,我們要理解保留消息和我們上節(jié)提到的持久會話無關(guān)庸蔼,一旦保留消息被存儲,將其移除的唯一方式就是下面所提到的辦法贮匕。
發(fā)送一條保留消息
從開發(fā)者的角度來說姐仅,發(fā)送一條保留消息是最簡單直接的辦法。你只需要將一條MQTT發(fā)布消息的保留標(biāo)志(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悼做,當(dāng)使用保留消息時,此主題的一個新訂閱者在訂閱后會立即收到設(shè)備的當(dāng)前狀態(tài)哗魂。對于那些周期性地發(fā)送數(shù)據(jù)肛走,如溫度,GPS坐標(biāo)或其他數(shù)據(jù)的客戶端也一樣录别。如果不使用保留信息朽色,訂閱者在發(fā)布者發(fā)送間隔期將對當(dāng)前狀態(tài)一無所知。而使用保留信息可以立即提供一個有效數(shù)據(jù)給新客戶端组题。