重要
此設定會要求您修改 Broker 資源。 它只會在初始部署時使用 Azure CLI 或 Azure 入口網站 進行設定。 如果需要訊息代理程式設定變更,則需要新的部署。 若要深入瞭解,請參閱 自定義預設 Broker。
MQTT 訊息代理程式進階用戶端選項可控制訊息代理程式與 MQTT 用戶端的互動方式。 這些設定會在連線期間交涉到訊息代理程式和用戶端,包括會話到期、訊息到期、接收上限,以及保持運作。 Azure IoT 作業特有的唯一設定是 訂閱者佇列限制。
如需可用設定的完整清單,請參閱 ClientConfig API 參考。
在許多情況下,預設客戶端設定就已足夠。 若要覆寫 MQTT 訊息代理程式的預設客戶端設定,請編輯 advanced.clients
Broker 資源中的 區段。 目前,只有在您使用 命令部署IoT作業--broker-config-file
時,才az iot ops create
支援此覆寫。
若要開始使用,請以 JSON 格式準備 Broker 組態檔,如下列範例所示:
{
"advanced": {
"clients": {
"maxSessionExpirySeconds": 282277,
"maxMessageExpirySeconds": 1622,
"subscriberQueueLimit": {
"length": 1000,
"strategy": "DropOldest"
},
"maxReceiveMaximum": 15000,
"maxKeepAliveSeconds": 300
}
}
}
然後,使用 az iot ops create
命令搭配 --broker-config-file
旗標來部署IoT作業,就像下列命令一樣。 (為了簡潔起見,請省略其他參數。
az iot ops create ... --broker-config-file <FILE>.json
若要深入瞭解,請參閱 進階 MQTT 訊息代理程式組態 和 Broker 範例的 Azure CLI 支援。
訂閱者佇列限制
MQTT 訊息代理程式會針對等候傳遞的 QoS 1 訊息,為每個訂閱者保留佇列。 從發行者接收訊息時,訊息會新增至此佇列。 訂閱者透過PUBACK訊息傳遞並認可之後,就會移除它們。 如果訊息送達的速度比訂閱者快,或者如果訂閱者使用持續性會話脫機,佇列可能會成長很大。
MQTT 訊息代理程式可以將 這些訊息緩衝到磁碟 以節省記憶體,但這種策略可能不一定足夠。 磁碟緩衝區可能未設定,或可能是因為其他訂閱者而已滿。 因此,訂閱者佇列限制有助於防止訊息代理程序針對單一訂閱者使用太多記憶體。
訂閱者佇列限制有兩個設定:
長度:可以針對單一訂閱者排入佇列的訊息數目上限。 如果佇列已滿且新的訊息送達,訊息代理程式會根據設定的策略卸除訊息。
策略:佇列已滿時要使用的策略。 這兩種策略如下:
- 無:除非會話到期,否則不會卸除訊息,而且佇列可以無限期成長。 這是預設行為。
- DropOldest:卸除佇列中最舊的訊息。
此限制僅適用於訂閱者的傳出佇列,此佇列會保留尚未指派封包標識碼的訊息,因為內部佇列已滿。 此限制不適用於正式發行前小眾測試佇列。
因為每個 後端分割區會套用限制,因此 MQTT 訊息代理程式無法保證整個叢集訂閱者的傳出訊息總數。 例如,將長度設定為 10,000 並不表示訂閱者最多會收到 10,000 則訊息。 相反地,它最多可以接收 10,000 * number of partitions * number of backend workers
訊息。
慢速訂閱者
緩慢的訂閱者是無法跟上傳入訊息速率的訂閱者。 如果訂閱者處理訊息速度緩慢、中斷連線或離線,就可能發生此問題。 訂閱者佇列限制有助於防止緩慢的訂閱者耗用太多記憶體。
訊息到期
此 maxMessageExpirySeconds
設定可控制訊息在到期前可留在佇列中的時間長度。 如果訊息在佇列中停留的時間超過最長到期時間,則會將其標示為已過期。 不過,只有在訊息到達佇列開頭時,才會捨棄過期的訊息。 此被動過期機制可藉由確保最終移除舊的訊息,協助管理記憶體使用量。
會話到期
此 maxSessionExpirySeconds
設定可與訂閱者佇列限制搭配運作,以確保訊息不會無限期地保留在佇列中。 如果會話到期,則會卸除該會話佇列中的所有訊息。 這種做法有助於防止離線訂閱者最終清除整個佇列來使用太多記憶體。
訊息到期和會話到期對於管理緩慢和離線訂閱者以及確保有效率的記憶體使用量都很重要。
訊息到期上限和保留的訊息
在 MQTT 5 中,保留的訊息會遵守封包中指定的 PUBLISH
訊息到期間隔。 如果已設定到期間隔,則會在間隔經過之後移除保留的訊息。 如果未提供任何間隔,訊息將無限期保持可用。
此 maxMessageExpirySeconds
設定會定義訊息到期的全域上限,並套用至所有訊息,包括保留的訊息。 例如,如果 maxMessageExpirySeconds
設定為 1000
秒,而保留的訊息指定到期時間間隔為 2000
秒,訊息仍會在 1000
秒後移除。
根據預設, maxMessageExpirySeconds
不會設定 。 在此情況下,除非訊息中明確定義到期間隔,否則保留的訊息不會過期。