2023年11月18日 星期六

MQTT 發布訂閱模式簡介

 MQTT 發布訂閱模式簡介

https://www.emqx.com/en/blog/mqtt-5-introduction-to-publish-subscribe-model

EMQX團隊
2023 年 3 月 14 日
MQTT 發布訂閱模式簡介

MQTT 發布訂閱模式

發布-訂閱模式是一種訊息傳遞模式,它允許發送訊息的客戶端(發布者)與接收訊息的客戶端(訂閱者)進行通信,而無需直接連接或不知道彼此的存在。

MQTT 發布-訂閱模式的本質是由一個稱為 Broker 的中間人角色負責路由和分發所有訊息。發布者向 Broker 發送帶有主題的訊息,訂閱者從 Broker 訂閱主題以接收感興趣的訊息。

在 MQTT 中,無法預先註冊或建立主題和訂閱。因此,經紀人無法預測有多少訂閱者會對特定主題感興趣。當發布者發送訊息時,代理商只會將其轉發給目前訂閱該主題的訂閱者。如果該主題目前沒有訂閱者,則該訊息將被丟棄。

MQTT 發布-訂閱模式有四個主要組件:發布者、訂閱者、代理商和主題。

  • 發行者Publisher

    發布者負責將訊息發佈到主題。它一次只能向一個主題發送數據,發布訊息時不需要關心訂閱者是否在線上。

  • 訂閱者Subscriber

    訂閱者透過訂閱一個主題來接收訊息,並且可以一次訂閱多個主題。MQTT 還支援透過共享訂閱在多個訂閱者之間實現負載平衡訂閱

  • 經紀人 Broker

    代理負責接收來自發布者的消息並將其轉發給適當的訂閱者。此外,代理還處理來自客戶端的連線、斷開連線、訂閱和取消訂閱的請求。

  • 主題 Topic

    MQTT 根據主題路由訊息。主題通常是分級的,並且/層級之間用斜線分隔,這類似於 URL 路徑。例如,主題可以是sensor/1/temperature多個訂閱者可以訂閱同一個主題,代理商會將有關該主題的所有訊息轉發給這些訂閱者。多個發布者還可以向相同主題發送訊息,代理將按照接收訊息的順序將這些訊息路由到訂閱的用戶端。

    在 MQTT 中,訂閱者可以使用主題通配符同時訂閱多個主題。這允許他們透過單一訂閱接收多個主題的訊息。請查看部落格以了解 MQTT 主題和通配符(按案例)以了解更多詳細資訊。

MQTT 發布訂閱架構

MQTT 發布訂閱架構

MQTT 發布-訂閱中的消息路由

在 MQTT 發布-訂閱模式中,用戶端可以充當發布者、訂閱者或兩者。當客戶端發布訊息時,會將其發送到代理,然後代理將訊息路由到該主題的所有訂閱用戶端。如果用戶端訂閱了某個主題,它將收到代理為該主題轉發的所有訊息。

在發布-訂閱系統中,通常有兩種常見的過濾和路由訊息的方法。

  • 按主題

    訂閱者可以向經紀人訂閱他們感興趣的主題。當發布者發送訊息時,它包含該訊息所屬的主題。代理程式使用此資訊來確定哪些訂閱者應該接收訊息並將其路由到適當的訂閱者。

  • 透過基於內容的過濾

    訂閱者可以指定訊息必須滿足的條件才能傳遞給他們。如果訊息的屬性或內容與訂閱者定義的條件匹配,則訊息將傳遞給該訂閱者。如果訊息不滿足訂閱者的條件,則不會發送。

除了基於主題路由訊息之外,EMQX 從 3.1 版本開始還透過其基於 SQL 的規則引擎提供進階訊息路由功能。此功能允許根據訊息內容路由訊息。有關規則引擎及其工作原理的更多信息,您可以參考EMQX 文件

MQTT 與 HTTP 請求和回應

HTTP 因其簡單易用而成為萬維網上廣泛使用的通訊協定。它不需要特定的客戶端,可以用於多種行業,包括物聯網(IoT)領域。在物聯網中,HTTP可用於連接物聯網設備和Web伺服器,從而實現對設備的遠端監控和控制。

儘管HTTP使用簡單且開發週期快,但在物聯網應用中使用時存在一些限制。一個缺點是,與 MQTT 相比,HTTP 訊息在協定層級具有更多的網路開銷。此外,HTTP 是一種無狀態協議,這意味著伺服器在處理請求時不會保留有關客戶端狀態的信息,並且無法從異常斷開連接中恢復。最後,HTTP 的請求回應模型需要輪詢來檢索更新,而 MQTT 可以透過訂閱提供即時更新。

由於其鬆散耦合的性質,MQTT 發布-訂閱模式具有一些固有的限制。例如,發布者沒有有關訂閱者狀態的信息,因此無法知道訂閱者是否已收到訊息或正確處理了訊息。為了解決這個問題,MQTT 5.0引入了請求響應功能,允許訂閱者在收到訊息後向主題發送回复,並允許發布者在收到回復後進行跟進。

MQTT 與訊息佇列

雖然 MQTT 和訊息隊列有許多相似之處(例如發布-訂閱模式),但它們的用途不同。訊息佇列主要用於在伺服器端應用程式之間儲存和傳輸訊息,這些應用程式通常處理大量資料但客戶端數量較少。另一方面,MQTT是一種訊息協議,主要用於物聯網設備之間的通信,物聯網設備通常有大量需要存取、管理和通訊的設備。

在一些實際情況下,MQTT經常與訊息佇列一起使用,讓MQTT伺服器專注於連接設備並在設備之間路由訊息。例如,MQTT伺服器接收來自物聯網設備的數據,然後透過訊息佇列將其傳送到各個業務系統進行處理。

與訊息佇列不同,MQTT 主題不需要預先建立。我們可以隨時向新主題發布訊息。當然,只有當有人訂閱時,這些訊息才會被消費,而不是被Broker直接丟棄。

結論

MQTT發布/訂閱機制可以輕鬆滿足我們一對一、一對多、多對一的通訊需求。其靈活性使其也非常適合用於物聯網領域以外的行業,例如網路廣播和行動推播通知。

到目前為止,您應該對 MQTT 發布-訂閱模式有了很好的了解。接下來,您可以查看部落格以了解如何建立 MQTT 連結。

您也可以造訪EMQ 提供的MQTT 入門與進階系列文章,以了解 MQTT 主題以及通配符、保留訊息、遺囑訊息等相關概念,探索 MQTT 的更多進階應用。這些資源將幫助您開始 MQTT 應用程式和服務開發。

沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...