MQTT

連線能力 > 協定 > MQTT

ActiveMQ Classic 支援 MQTT 協定,並且會自動在 JMS/NMS 和 MQTT 用戶端之間進行對應。MQTT 是一種機器對機器 (M2M) 發佈/訂閱訊息傳輸。

請參閱 MQTT 網站 以取得更多詳細資訊

支援的版本

ActiveMQ Classic 支援 MQTT v3.1.1v3.1

為 MQTT 啟用 ActiveMQ Classic Broker

為 MQTT 啟用 ActiveMQ Classic 非常容易。只需使用 MQTT URL 將連接器新增至 Broker 即可。

<transportConnectors>
   <transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883"/>
</transportConnectors>

MQTT 線路格式

MQTT 使用精簡的二進位格式,可以使用以下選項進行配置。 所有選項都可以在 Broker 的傳輸繫結 URI 上進行配置。

參數名稱 預設值 描述
maxFrameSize 268435456 (v5.12.0) 可以傳送的最大框架大小。協定限制為 256 MB,並且此值無法設定得更高。可以幫助防止 OOM DOS 攻擊

所有選項都必須在前面加上 wireFormat 才能生效。如果沒有正確的格式,選項將不會有任何作用。

線路格式配置範例

<transportConnector name="mqtt" uri="mqtt://127.0.0.1:61612?wireFormat.maxFrameSize=100000"/>

安全性

ActiveMQ Classic MQTT 傳輸實作完全支援 ActiveMQ Classic 安全性機制。此外,當您嘗試存取(讀取/寫入)特定目的地時,將會套用授權原則。

啟用 MQTT over NIO

為了更好的可擴展性(和效能),您可能想要透過 NIO 傳輸執行 MQTT 協定。為此,只需使用 mqtt+nio 傳輸前綴而不是 mqtt。例如,在您的 XML 檔案中新增以下傳輸配置

<transportConnector name="mqtt+nio" uri="mqtt+nio://127.0.0.1:1883"/>

此傳輸在底層使用 NIO 傳輸,並且通常比標準連接器使用更少的執行緒。

啟用 MQTT over NIO + SSL

MQTT 傳輸也支援使用 NIO 和 SSL。若要啟用此選項,請使用 mqtt+nio+ssl 協定 - 例如。

<transportConnector name="mqtt+nio" uri="mqtt+nio+ssl://127.0.0.1:1883"/>
  • 如需在 ActiveMQ Classic 中使用 SSL 的更多詳細資訊,請參閱以下文章(我該如何使用 SSL)。

使用 MQTT 處理目的地

MQTT 支援階層和萬用字元,但分隔符號和字元不同:- 以下是對應

功能 ActiveMQ Classic MQTT
分隔符號 . /
元素 * +
子樹 > #

這些值會在使用 JMS/NMS/Stomp 的用戶端和使用 MQTTT 的用戶端之間自動轉置。例如 - 訂閱「foo/#/bar」的用戶端將會收到在 foo.blah.bar 的 JMS 主題上發佈的訊息。

訊息轉換

MQTT 訊息會轉換為 JMS ByteMessage。相反地,任何 JMS 訊息的主體都會轉換為位元組緩衝區,作為 MQTT 訊息的酬載。

保持連線

當用戶端連線時,它將會傳送保持連線的持續時間,通常預設為 10 秒。ActiveMQ Classic 會透過設定非作用監視器來遵循保持連線的持續時間,該監視器允許 1.5 * 持續時間的寬限期。在該寬限期經過後,如果沒有活動,則可能會關閉連線。接收 PINGREQ 和傳送 PINGRESP 的 Broker 會被視為保持連線開啟的活動。

如果用戶端傳送保持連線值 0,ActiveMQ Classic 將不會設定 非作用監視器,並且連線不會因非作用而自動關閉。但是,這可能會導致潛在的洩漏連線,因此可以在伺服器端(例如由管理員)設定預設的保持連線,以不允許非作用連線掛起。只有在指定且用戶端請求保持連線值為 0 時,才會使用此預設保持連線。保持連線值的單位為毫秒。

若要啟用預設的伺服器端 MQTT 保持連線

<transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?transport.defaultKeepAlive=60000"/>

訊息預取

當 MQTT 用戶端連線時,它會在本地建立類似 JMS 的消費者至 Broker。在較舊的版本中,此消費者建立時的預取大小為 1(訊息預取的詳細說明請參閱此處)。從 5.11.0 版本開始,預取大小會調整為適用 JMS 訂閱的預設值。QoS=0 訂閱具有一般非持久主題訂閱的預設預取,而 QoS=1 和 QoS=2 則會根據所使用的訂閱策略,指派持久訂閱者或佇列訂閱的預取大小(如需更多詳細資訊,請參閱下一節)。預設預取值列於此處

若要變更預取大小的預設值,您可以使用activeMQSubscriptionPrefetch 傳輸選項,例如

<transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?transport.activeMQSubscriptionPrefetch=32766"/>

訂閱策略

ActiveMQ Classic 的核心是 JMS Broker,因此需要在 MQTT 訂閱和 JMS 語意之間建立一些對應。QoS=0(至多一次)的訂閱會直接對應至一般的 JMS 非持久主題。對於可靠的訊息傳遞,QoS=1 和 QoS=2 預設會將訂閱轉換為 JMS 持久主題訂閱者。在大多數情況下,此行為是理想的。對於某些使用案例,將這些訂閱對應至虛擬主題會很有用。虛擬主題提供更好的可擴展性,如果您想在 Broker 網路中使用 MQTT 訂閱者,通常會是更好的解決方案。若要將訂閱策略變更為使用虛擬主題,請使用以下設定

<transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?transport.subscriptionStrategy=mqtt-virtual-topic-subscriptions"/>

保留訊息

如果訊息已發佈且設定了保留旗標,則主題會「記住」訊息,以便在新的訂閱到達時,將最後保留的訊息傳送至訂閱。在底層,Broker 會使用保留訊息訂閱復原原則,以保留設定了 _ActiveMQ.Retain_ 屬性的訊息。在訊息轉換期間,具有保留旗標的 MQTT 訊息會變成設定了 _ActiveMQ.Retain_ 屬性並由 Broker 保留的 JMS 訊息。

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛標誌和 Apache ActiveMQ 專案標誌是 The Apache Software Foundation 的商標。Copyright © 2024, The Apache Software Foundation。根據Apache License 2.0 授權。