MQTT
ActiveMQ Classic 支援 MQTT 協定,並且會自動在 JMS/NMS 和 MQTT 用戶端之間進行對應。MQTT 是一種機器對機器 (M2M) 發佈/訂閱訊息傳輸。
請參閱 MQTT 網站 以取得更多詳細資訊
支援的版本
ActiveMQ Classic 支援 MQTT v3.1.1 和 v3.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 訊息。