1. 程式人生 > >EMQ學習筆記---Clean Session和Retained Message

EMQ學習筆記---Clean Session和Retained Message

設置 als 部分 說明 flag 後來 pub 發布 上線

MQTT會話(Clean Session)
MQTT客戶端向服務器發起CONNECT請求時,可以通過’Clean Session’標誌設置會話。
‘Clean Session’設置為0,表示創建一個持久會話,在客戶端斷開連接時,會話仍然保持並保存離線消息,直到會話超時註銷。
‘Clean Session’設置為1,表示創建一個新的臨時會話,在客戶端斷開時,會話自動銷毀。

當clean session的值為false,即保留會話,那麽
該客戶端上線,並訂閱了主題"r",那麽該主題會一直存在,即使客戶端離線,該主題也仍然會記憶在EMQ服務器內存。
當客戶端離線又上線時,仍然會接收到離線期間別人發來的publish消息(QoS=0,1,2)。類似即時通訊軟件,終端可以接收離線消息。


除非客戶端主動取消訂閱主題,否則主題一直存在。另外,Mnesia本地不會持久化session,subscription和topic,服務器重啟則丟失。

Mnesia是一個分布式數據庫管理系統(DBMS),適合於電信和其它需要持續運行和具備軟實時特性的Erlang應用,是構建電信應用的控制系統平臺開放式電信平臺(OTP)的一部分。

當clean session的值為true,即不保留會話,那麽
該客戶端上線,並訂閱了主題"r",那麽該主題會隨著客戶端離線而刪除。
當客戶端離線又上線時,接收不到離線期間別人發來的publish消息。

不管clean session的值是什麽,當終端設備離線時,QoS=0,1,2的消息一律接收不到。


當clean session的值為true,當終端設備離線再上線時,離線期間發來QoS=0,1,2的消息一律接收不到。
當clean session的值為false,當終端設備離線再上線時,離線期間發來QoS=0,1,2的消息仍然可以接收到。如果同個主題發了多條就接收多條,一條不差,照單全收。

emqttd服務器程序,客戶端每發起一個tcp連接就會新建一個client connection和一次會話,後臺會新建一個相應的connection進程和一個session進程。同一topic下,當設備A離線時,設備B在publish消息時,仍然可以匹配topic,進而找到這個session A進程,把消息發給設備A,緩存在消息隊列裏。設備A上線就可以收到離線消息。

QTT保留消息(Retained Message)

MQTT客戶端向服務器發布(PUBLISH)消息時,可以設置保留消息(Retained Message)標誌。保留消息(Retained Message)會駐留在消息服務器,後來的訂閱者訂閱主題時仍可以接收該消息。

關於retain的說明
Mnesia:retained_message
終端設備publish消息時,如果retain值是true,則服務器會一直記憶,哪怕是服務器重啟。因為Mnesia會本地持久化。
如果服務器接收到終端publish某主題的消息,payload為空且retain值是true,則會刪除這條持久化的消息。

如果服務器接收到終端publish某主題的消息,payload為空且retain值是false,則不會刪除這條持久化的消息。

emqttd v1.1.3
-module(emqttd_retainer).
%% RETAIN flag set to 1 and payload containing zero bytes
retain(#mqtt_message{retain = true, topic = Topic, payload = <<>>}) ->
    emqttd_backend:delete_message(Topic);

  

EMQ學習筆記---Clean Session和Retained Message