發佈訂閱模式雖然讓消息的發佈者與訂閱者充分解耦,但也出現了一個隱含的問題,即訂閱者沒法主動向發佈者請求消息,訂閱者什麼時候收到消息徹底依賴於發佈者什麼時候發佈消息,這在某些場景中就產生了不便。例如,某設備按期發佈自身 GPS 座標,但對於訂閱者而言,從它發起訂閱到第一次收到數據可能須要幾秒鐘,也可能須要十幾分鍾甚至更多,這樣並不友好。所以 MQTT 引入了保留消息。git
當服務端收到 Retain 標誌爲 1 的 PUBLISH 報文時,它將進行如下操做:github
而每當有訂閱者創建訂閱時,服務端就會查找是否存在匹配該訂閱的保留消息,若是保留消息存在,就會當即轉發給訂閱者。當保留消息在這種狀況下被轉發給訂閱者時,它的 Retain 標誌必須保持爲 1。相比 MQTT v3.1.1,MQTT v5.0 對於訂閱創建時是否發送保留消息作了更細緻的劃分,並在訂閱選項中提供了 Retain Handling 字段。例如某些客戶端可能僅但願在首次訂閱時接收保留消息,又或者不但願在訂閱創建時接收保留消息,均可以經過 Retain Handling 選項調整。spa
保留消息雖然存儲在服務端中,但它並不屬於會話的一部分。也就是說,即使發佈這個保留消息的會話終結,保留消息也不會被刪除。刪除保留消息只有兩種方式:blog
藉助保留消息,新的訂閱者可以當即獲取最近的狀態,而不須要等待沒法預期的時間,這在不少場景下很很是重要的。文檔
更多信息請訪問咱們的官網 emqx.io,或關注咱們的開源項目 github.com/emqx/emqx ,詳細文檔請訪問 官方文檔。get