MQTT 釋出/訂閱模式
釋出訂閱模式(Publish-Subscribe Pattern)是一種訊息傳遞模式,它將傳送訊息的客戶端(釋出者)與接收訊息的客戶端(訂閱者)解耦,使得兩者不需要建立直接的聯絡也不需要知道對方的存在。
MQTT 釋出/訂閱模式的精髓在於由一個被稱為代理(Broker)的中間角色負責所有訊息的路由和分發工作,釋出者將帶有主題的訊息傳送給代理,訂閱者則向代理訂閱主題來接收感興趣的訊息。
在 MQTT 中,主題和訂閱無法被提前註冊或建立,所以代理也無法預知某一個主題之後是否會有訂閱者,以及會有多少訂閱者,所以只能將訊息轉發給當前的訂閱者,如果當前不存在任何訂閱,那麼訊息將被直接丟棄。
MQTT 釋出/訂閱模式有 4 個主要組成部分:釋出者、訂閱者、代理和主題。
釋出者(Publisher)
負責將訊息釋出到主題上,釋出者一次只能向一個主題傳送資料,釋出者釋出訊息時也無需關心訂閱者是否線上。
訂閱者(Subscriber)
訂閱者透過訂閱主題接收訊息,且可一次訂閱多個主題。MQTT 還支援透過共享訂閱的方式在多個訂閱者之間實現訂閱的負載均衡。
代理(Broker)
負責接收發布者的訊息,並將訊息轉發至符合條件的訂閱者。另外,代理也需要負責處理客戶端發起的連線、斷開連線、訂閱、取消訂閱等請求。
主題(Topic)
主題是 MQTT 進行訊息路由的基礎,它類似 URL 路徑,使用斜槓
/
進行分層,比如sensor/1/temperature
。一個主題可以有多個訂閱者,代理會將該主題下的訊息轉發給所有訂閱者;一個主題也可以有多個釋出者,代理將按照訊息到達的順序轉發。MQTT 還支援訂閱者使用主題萬用字元一次訂閱多個主題。更多關於 MQTT 主題的介紹可檢視部落格:透過案例理解 MQTT 主題與萬用字元。
MQTT 釋出/訂閱中的訊息路由
在 MQTT 釋出/訂閱模式中,一個客戶端既可以是釋出者,也可以是訂閱者,也可以同時具備這兩個身份。 當客戶端釋出一條訊息時,它會被髮送到代理,然後代理將訊息路由到該主題的所有訂閱者。 當客戶端訂閱一個主題時,它會收到代理轉發到該主題的所有訊息。
一般來說,大多數釋出/訂閱系統主要透過以下兩種方式過濾並路由訊息。
根據主題
訂閱者向代理訂閱自己感興趣的主題,釋出者釋出的所有訊息中都會包含自己的主題,代理根據訊息的主題判斷需要將訊息轉發給哪些訂閱者。
根據訊息內容
訂閱者定義其感興趣的訊息的條件,只有當訊息的屬性或內容滿足訂閱者定義的條件時,訊息才會被投遞到該訂閱者。
MQTT 協議是基於主題進行訊息路由的,在這個基礎上,EMQX 從 3.1 版本開始透過基於 SQL 的規則引擎提供了額外的按訊息內容進行路由的能力。關於規則引擎的詳細資訊,請檢視 EMQX 文件。
MQTT 與 HTTP 請求響應
HTTP 是全球資訊網資料通訊的基礎,其簡單易用無客戶端依賴,被廣泛應用於各個行業。在物聯網領域,HTTP 也可以用於連線物聯網裝置和 Web 伺服器,實現裝置的遠端監控和控制。
雖然使用簡單、開發週期端,但是基於請求響應的 HTTP 在物聯網領域的應用卻有一定的侷限性。首先,協議層面 HTTP 報文相較與 MQTT 需要佔用更多的網路開銷;其次,HTTP 是一種無狀態協議,這意味著伺服器在處理請求時不會記錄客戶端的狀態,也無法實現從連線異常斷開中恢復;最後,請求響應模式需要透過輪詢才能獲取資料更新,而 MQTT 透過訂閱即可獲取實時資料更新。
釋出訂閱模式的松耦合特性,也給 MQTT 帶來了一些副作用。由於釋出者並不知曉訂閱者的狀態,因此釋出者也無法得知訂閱者是否收到了訊息,或者是否正確處理了訊息。為此,MQTT 5.0 增加了請求響應特性,以實現訂閱者收到訊息後向某個主題傳送應答,釋出者收到應答後再進行後續操作。
MQTT 與訊息佇列
儘管 MQTT 與訊息佇列的很多行為和特性非常接近,比如都採用釋出/訂閱模式,但是他們面向的場景卻有著顯著的不同。訊息佇列主要用於服務端應用之間的訊息儲存與轉發,這類場景往往資料量大但客戶端數量少。MQTT 是一種訊息傳輸協議,主要用於物聯網裝置之間的訊息傳遞,這類場景的特點是海量的裝置接入、管理與訊息傳輸。
在一些實際的應用場景中,MQTT 與訊息佇列往往會被結合起來使用,以使 MQTT 伺服器能專注於處理裝置的連線與裝置間的訊息路由。比如先由 MQTT 伺服器接收物聯網裝置上報的資料,然後再透過訊息佇列將這些資料轉發到不同的業務系統進行處理。
不同於訊息佇列,MQTT 主題不需要提前建立。MQTT 客戶端在訂閱或釋出時即自動的建立了主題,開發者無需再關心主題的建立,並且也不需要手動刪除主題。
結語
MQTT 的釋出/訂閱機制可以很輕易地滿足我們一對一、一對多、多對一的通訊需要。這也在很大程度上拓寬了 MQTT 在 IoT 領域之外的應用,像網路直播互動、手機訊息推送等行業場景,都非常適合使用 MQTT。
至此,相信讀者已對 MQTT 的釋出/訂閱模式有了深刻的理解,接下來,可檢視部落格建立 MQTT 連線時如何設定引數?瞭解如何建立一個 MQTT 連線。或訪問 EMQ 提供的 MQTT 入門與進階系列文章學習 MQTT 主題及萬用字元、保留訊息、遺囑訊息等相關概念,探索 MQTT 的更多高階應用,開啟 MQTT 應用及服務開發。
版權宣告: 本文為 EMQ 原創,轉載請註明出處。
原文連結:https://www.emqx.com/zh/blog/mqtt-5-introduction-to-publish-subscribe-model