在 Azure 事件方格中路由 MQTT 訊息

事件方格可讓您將 MQTT 訊息路由至 Azure 服務或 Webhook,以進一步處理。 因此,您可以在資料分析、儲存和視覺效果,以及其他使用案例中使用 IoT 資料,建置端對端解決方案。

MQTT 訊息路由的圖表。

如何使用路由功能?

將訊息從您的用戶端路由至 Azure 服務或自訂端點,可讓您將此資料的優點最大化。 以下是利用此功能的一些使用案例:

  • 資料分析:擷取和分析來自用戶端的路由訊息,以最佳化您的解決方案。 例如,分析機器的遙測,以預測在發生失敗前何時排程維護,以避免延遲和進一步的損壞。
  • 無伺服器應用程式:根據來自用戶端的路由訊息觸發無伺服器函式。 例如,當動作感應器偵測到動作時,將通知傳送給安全性人員以解決此問題。
  • 資料視覺效果:從用戶端建置路由資料的視覺效果,以輕鬆呈現和了解資料,以及突顯趨勢和極端值。

路由設定:

路由設定可讓您將所有 MQTT 訊息從用戶端傳送至事件方格命名空間主題事件方格自訂主題。 訊息進入主題之後,您可以設定事件訂閱來取用主題中的訊息。 使用下列高階步驟來達成此設定:

  • 命名空間主題作為路由目的地:
    • 建立事件方格命名空間主題,其中所有 MQTT 訊息皆已路由。
    • 建立推送類型的事件訂用帳戶,以將這些訊息路由至其中一個支援的 Azure 服務或自訂 Webhook 或佇列類型的事件訂用帳戶,以透過您的應用程式直接從命名空間主題提取訊息。
    • 設定路由設定,參考您在第一個步驟中建立的主題。

將 MQTT 訊息路由至命名空間主題的圖表。

將 MQTT 訊息路由至自訂主題的圖表。

注意

停用命名空間上的公用網路存取會導致 MQTT 路由失敗。

命名空間主題和自訂主題作為路由目的地之間的差異

下表顯示命名空間主題和自訂主題作為路由目的地之間的差異。 如需每個事件方格資源中包含哪些配額和限制的詳細明細,請參閱配額和限制

比較點 命名空間主題 自訂主題
輸送量 高,最高 40 MB/秒 (輸入) 和 80 MB/秒 (輸出) 低,最高 5 MB/秒 (輸入和輸出)
提取傳遞 Yes
推送傳遞至事件中樞 Yes Yes
推送傳遞至 Azure 服務 (Functions、Webhook、服務匯流排佇列和主題、轉送混合式連線和儲存體佇列) Yes
訊息保留期 7 天 1 天
角色指派需求 不需要,因為 MQTT 訊息代理程式和命名空間主題位於相同的命名空間下 必要,因為裝載 MQTT 訊息代理程式功能和自訂主題的命名空間是不同的資源

路由的事件方格自訂主題需求

用於路由的事件方格自訂主題必須符合下列需求:

  • 必須設定為使用雲端事件結構描述 v1.0
  • 必須位於與命名空間相同的區域中。
  • 您必須將「事件方格資料傳送者」角色指派給自己,或指派給事件方格自訂主題上選取的受控識別,才能套用路由設定。
    • 在入口網站中,移至已建立的事件方格主題資源。
    • 在 [存取控制 (IAM)] 功能表項目中,選取 [新增角色指派]。
    • 在 [角色] 索引標籤中,選取 [事件方格資料傳送者],然後選取 [下一步]。
    • 在 [成員] 索引標籤中,選取 [+選取成員],然後在出現的 [選取] 方塊中輸入您的 AD 使用者名稱 (例如,user@contoso.com)。
    • 選取您的 AD 使用者名稱,然後選取 [檢閱 + 指派]

Azure 入口網站設定

使用下列步驟設定路由:

  • 在 Azure 入口網站中,移至您的命名空間。
  • 在 [路由] 下,檢查 [啟用路由]。
  • 在主題類型底下,選取 [命名空間主題] 或 [自訂主題]
  • 在主題底下,選取您已建立的主題,其中所有 MQTT 訊息皆已路由。
  • 如果已選取自訂主題,[傳遞的受控識別] 區段隨即顯示。 針對將 MQTT 訊息傳遞至自訂主題時,會用來驗證 MQTT 代理的身分識別,選取下列其中一個選項:
    • 無:在此案例中,您必須在自訂主題上將「事件方格資料傳送者」角色指派給自己。
    • 系統指派的身分識別:在此情況下,您必須在命名空間上啟用系統指派的身分識別作為必要條件,並將「EventGrid 資料傳送者」角色指派給自訂主題上的系統指派身分識別。
    • 使用者指派的身分識別:在此情況下,您必須在命名空間上啟用使用者指派的身分識別作為必要條件,並將「EventGrid 資料傳送者」角色指派給自訂主題上選取的身分識別。
      • 如果已選取 [使用者指派的身分識別],則會出現下拉式清單,讓您選取所需的身分識別。
  • 選取套用。

顯示透過入口網站路由設定的螢幕擷取畫面。

如需擴充設定指示,請移至擴充入口網站設定

Azure CLI 設定

az resource create --resource-type Microsoft.EventGrid/namespaces --id /subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.EventGrid/namespaces/<Namespace Name> --is-full-object --api-version 2023-06-01-preview --properties @./resources/NS.json

NS.json

"properties": {
	"inputSchema": "CloudEventSchemaV1_0",
	"topicSpacesConfiguration": {
	    "state": "Enabled",           
	    "routeTopicResourceId": "/subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.EventGrid/topics/<Event Grid topic name>",
        "routingIdentityInfo": {
                "type": "UserAssigned", //Allowed values: None, SystemAssigned, UserAssigned
                "userAssignedIdentity": "/subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<User-assigned identity>" //needed only if UserAssigned was the value of type
            },

	}
}

如需擴充設定指示,請移至擴充 CLI 設定

MQTT 訊息路由行為

將 MQTT 訊息路由至自訂主題時,事件方格會提供持久傳遞,因為它會嘗試立即傳遞每個訊息至少一次。 如果失敗,事件方格會重試傳遞,或捨棄要路由的訊息。 事件方格不保證事件傳遞的順序,因此訂閱者可能會依序接收它們。

下表描述根據不同錯誤進行 MQTT 訊息路由的行為。

錯誤 錯誤描述 行為
TopicNotFoundError 已刪除設定要接收所有 MQTT 路由訊息的自訂主題。 事件方格會捨棄要路由的 MQTT 訊息。
AuthenticationError 已刪除設定為 MQTT 路由訊息目的地的自訂主題之事件方格資料傳送者角色。 事件方格會捨棄要路由的 MQTT 訊息。
TooManyRequests 每秒的 MQTT 路由訊息數目超過自訂主題的發佈限制。 事件方格會重試以路由 MQTT 訊息。
ServiceError 由於伺服器作業原因發生未預期的伺服器錯誤。 事件方格會重試以路由 MQTT 訊息。

重試期間,事件方格會針對 MQTT 訊息路由使用指數輪詢重試原則。 事件方格會以最佳方式重試下列排程的傳遞:

  • 10 秒
  • 30 秒
  • 1 分鐘
  • 5 分鐘
  • 10 分鐘
  • 30 分鐘
  • 1 小時
  • 3 小時
  • 6 小時
  • 每 12 小時

如果已排入佇列以進行重新傳遞的路由 MQTT 訊息成功,事件方格會嘗試以最佳方式從重試佇列移除訊息,但可能仍會收到重複項目。

後續步驟:

使用下列文章以深入了解路由:

快速入門:

概念: