摘要:如何構建商業級別聊天系統篇四特性之持久會話保留消息遺囑本篇將介紹的一些我們應該關注的特性關注不迷路我是擱淺神秘地址持久會話為什么需要持久會話為了接收的消息,客戶端在連接時會創建其感興趣主題的訂閱。代理僅存儲每個主題的一條保留消息。
本篇將介紹 MQTT 的一些我們應該關注的特性
關注不迷路!! 我是 dying 擱淺 神秘地址
為了接收 MQTT broker 的消息,客戶端在連接 broker 時會創建其感興趣主題的訂閱。當客戶端和代理的連接在非持久會話中斷開時,這些主題將丟失,這意味著客戶端在重新連接時需要重新訂閱,這對于資源受限的客戶端來說是一筆很高的消耗。同時我們在大多數業務場景下都需要保存一個持久的會話來記錄客戶端的狀態(如保存在 DB 中)。那么將會話的狀態等信息保存到代理 broker 中就是一個很好的選擇。在客戶端與服務代理建立連接時根據唯一的標識來提供會話的信息(如登錄憑證或者 clientId)
客戶端可以通過 cleanSession 進行標記,來告訴 broker 代理自己需要怎樣的會話,在與代理建立連接時可以選擇請求持久會話。
cleanSession = true 非持久會話 如果客戶端請求非持久會話,那么當客戶端與代理斷連時其前一個持久會話的所有排隊消息都將丟失。
cleanSession = false 持久會話 如果客戶端請求持久會話,代理服務端將保存會話的所有信息
這里我們將會話分為: persistent session 持久會話 和 clean session 清潔會話
何時使用 持久會話?
何時使用 清潔會話?
為什么需要保留消息?
對于 消息發布者 和 主題訂閱者,雙方對于相互的狀態是無感知的,因為我們的 broker 代理 代理了這一切,那么消息發布者只能確保消息正確的發送到了 broker 代理,而 broker 代理 和 主題訂閱者之間同樣如此。而 消息發布者 并不確定何時向對應的主題發布消息,那在這期間,新訂閱主題的客戶端對該主題的狀態一無所知。這個時候,保留消息就起到的它的作用。
什么是保留消息?
保留消息 是 一條普通的 MQTT 消息 其 retained flag 設置為 true,broker 代理為主題存儲其最后一條保留消息以及其 Qos 級別。
那么每個訂閱匹配該主題的客戶端在訂閱后將立即收到該條 保留消息。代理僅存儲每個主題的一條保留消息。
訂閱客戶端 可以通過 retained flag 來識別該條消息是否為 保留消息,以便決定如何處理它。
保留消息的作用:
保留消息可以幫助 新訂閱的客戶端 立即獲得該主題的狀態更新,其消除了等待 發布客戶端 發布下一條消息的時間間隔。
啊,那么我們什么時候應該使用保留消息呢?當你希望新訂閱的客戶端立即獲取主題消息時,保留消息是有意義的。
這對于單個組件主題的狀態更新非常有用,例如 /my/temperature 獲取溫度狀態,如果使用保留消息,新訂閱者在訂閱時將立即獲取最后的溫度狀態。如果沒有使用,那么在發布者發布下一條消息期間,新訂閱者將處于黑暗狀態。
為什么需要遺囑?
MQTT 經常構建于不可靠的網絡場景,由于連接丟失,電量耗盡,可能會發生異常斷開的情況。了解客戶端是 正常斷開(MQTT DISCONNECT 消息) 還是 異常斷開 有助于我們進行正確的響應,這里遺囑消息就發揮了作用。
LWT 最后的遺囑 Last Will and Testament
在 MQTT 中使用 LWT 最后的遺囑來通知 其他客戶端 異常斷開的情況。每個客戶端在連接到代理時,可以指定 LWT
LWT 是一條普通的 MQTT 消息帶有 主題、保留消息標志、QoS 和 payload。代理保存該消息直到客戶端異常斷開,此時代理會將 LWT 消息發送給每個訂閱該主題的客戶端。當客戶端正常斷開時,LWT 消息會被代理直接丟棄。
如何指定 LWT?
在客戶端 CONNECT 時,客戶端可以指定一條 LWT 消息
代理應該在何時發送 LWT 消息?
根據 MQTT 規范,borker 代理 必須在以下情況分發 客戶端 LWT 消息:
最后的遺囑 LWT 是通知訂閱客戶端,發布客戶端異常斷開的有效手段。其在生產上經常和 保留消息一起配合使用,以存儲客戶端在特定主題上的狀態。
舉個例子:client1 首先向 broker 發送 CONNECT 數據包其中
lastWillMessage 將 ”offline“ 作為 payload
lastWillRetain 設置為 true
lastWillTopic 設置為 client1/status
連接之后 client1 再向主題發送一條 PUBLISH 消息,其 payload 為 ”online“ 并將其 retain flag 設置為 true。
此時 只要 client1保持連接,那么所有新訂閱主題的客戶端都會收到一條 ”online“ 消息。
如果 client1 異常斷開,broker 會給所有訂閱客戶端發送 ”offline“ 的 LWT 消息,同時 LWT 消息會成為新的保留消息發送給新的訂閱者。
這種特定的保留消息模式,可以讓其他客戶端知道,client1 在特定主題上的連接狀態。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/118877.html
摘要:如何構建商業級別聊天系統篇五保活,請不要讓你的服務變成小豬佩奇特關人上人擱淺神秘連接哥哥姐姐弟弟妹妹叔叔阿姨們說點閑話保活,不光是對于來說需要保活,其實我們很多的系統,在需要確定對方是否處于可通信狀態的時候都是需要這種保活機制。 ...
摘要:協議版本介紹互聯網的基礎網絡協議是協議消息隊列遙測傳輸是基于協議棧而構建的已成為通信的標準為什么選擇有多好多好多么牛逼我就不說了說的再多不如一個一個試試完了做比對剩下的那個就是要選擇的實在不想這樣搞技術就跟著一線走發布和訂閱模型協議在網絡中 mqtt 協議版本: 3.1.1 MQTT 介紹 互聯網的基礎網絡協議是 TCP/IP協議. MQTT(消息隊列遙測傳輸)是基于 TCP/IP 協...
摘要:本文是其中的一個解決方案。地址客戶端服務端前端網頁介紹,消息隊列遙測傳輸是開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。必須用于在頂層分隔符之后,除了當自己指定時。 1. 問題描述 最近,本實驗室大量上馬云測量,云監控方面的項目,大概是屬于物聯網應用的一個分支。老板也有將舊有儀器改造的想法,所以要實現儀器設備的云控制。本文是其中的一個解決方案。 2. 技術選型 消息隊列:M...
摘要:一簡介實現方式實現協議需要客戶端和服務器端通訊完成,在通訊過程中,協議中有三種身份發布者代理服務器訂閱者。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是訂閱者。 ...
閱讀 2609·2021-11-22 15:25
閱讀 1429·2021-11-15 17:59
閱讀 1129·2021-09-29 09:34
閱讀 1535·2021-09-26 09:46
閱讀 3030·2021-09-02 15:40
閱讀 1190·2019-08-30 15:56
閱讀 3281·2019-08-30 15:55
閱讀 693·2019-08-29 17:08