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

Event Grid 讓你能將 MQTT 訊息路由到 Azure 服務或 webhook 進行進一步處理。 透過路由這些資料,你可以打造端對端解決方案,利用物聯網資料進行分析、儲存與視覺化。

本文說明何時使用路由,並示範如何將路由設定為事件網格命名空間主題或自訂主題。

圖示顯示 MQTT 訊息從裝置經由 Azure 事件方格 路由到處理程序,如 Azure 服務、webhook 和應用程式。

何時使用路由

將客戶訊息路由至 Azure 服務或自訂端點,能最大化這些資料的效益。 以下列表描述了此功能的多種使用情境:

  • 資料分析:從客戶那裡擷取並分析路由訊息,以優化您的解決方案。 例如,分析機器的遙測數據,預測何時該在故障發生前安排維護,以避免延誤與進一步損害。
  • 無伺服器應用程式:根據客戶端路由的訊息觸發無伺服器函式。 例如,當動作感應器偵測到動作時,應通知保全人員處理。
  • 資料視覺化:建立客戶路由資料的視覺化,以呈現並理解數據,並突顯趨勢與異常值。

設定路由

路由設定讓你能將所有客戶端的 MQTT 訊息傳送到事件 網格命名空間主題 或 事件網格自訂主題。 在訊息位於主題中之後,您可以設定事件訂用帳戶,以取用主題中的訊息。 請依照以下高階步驟達成此配置:

  • 將命名空間主題設為路由目標:
    • 建立一個事件網格命名空間主題 ,讓事件網格路由所有 MQTT 訊息。
    • 建立推送型事件訂閱,將這些訊息導向支援的 Azure 服務或自訂 webhook,或建立隊列型事件訂閱,直接透過應用程式從命名空間主題拉取訊息。
    • 設定與你第一步建立主題相關的 路由配置 。

MQTT 訊息路由至命名空間主題的示意圖。

MQTT 訊息路由至自訂主題的示意圖。

備註

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

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

下表展示了命名空間主題與自訂主題作為路由目的地的差異。 關於每個事件網格資源包含的詳細配額與限制,請參見 配額與限制。

比較點 命名空間主題 自訂主題
Throughput 高速,最高可達 40 MB/s(入口)及 80 MB/s(出口) 低,最高可達 5 MB/s (輸入與輸出)
接收傳遞 是的 No
推送傳遞至事件中樞 是的 是的
推送傳遞至 Azure 服務 (Functions、Webhooks、服務匯流排佇列與主題、Relay 混合式連線,以及儲存體佇列) No 是的
訊息保留期 7 天 1 天
角色指派要求 不需要,因為 MQTT broker 和命名空間主題屬於同一個命名空間 必須,因為承載 MQTT 代理功能的命名空間與自訂主題是不同的資源

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

你用來路由的 Event Grid 自訂主題需要符合以下要求:

  • 它需要使用 CloudEvents 架構 v1.0。
  • 它必須與命名空間位於同一區域。
  • 你需要在套用路由設定前,先將 事件網格資料發送 者角色指派給自己或事件網格自訂主題中所選的管理身份。 若要指派角色:
    1. 在入口網站中,前往你建立的事件網格主題資源。
    2. 在 存取控制(IAM) 選單中,選擇 新增角色指派。
    3. 在 角色 標籤中,選擇 事件網格資料發送器,然後選擇 下一步。
    4. 在「會員」分頁,選擇「選擇成員」,然後在出現的「選擇」框中輸入你的 Microsoft Entra 使用者名稱(例如,user@contoso.com)。
    5. 選擇你的 Microsoft Entra 使用者名稱,然後選擇檢視 + 指派。

Azure 入口網站組態

要設定路由:

  1. 在 Azure 入口網站中,移至您的命名空間。
  2. 在 路由中選擇 啟用路由。
  3. 在主題 類型中,選擇 命名空間主題 或 自訂主題。
  4. 對於 主題,選取你所建立、所有 MQTT 訊息都會路由至該處的主題。
  5. 如果你選擇自訂主題,就會顯示「 傳送的管理身份 」區塊。 請為身分識別選擇下列其中一個選項,在 MQTT 代理將 MQTT 訊息傳送至自訂主題時進行驗證:
    • 無:在自訂主題中,將 事件網格資料發送 者角色指定給自己。
    • 系統指派身分:先決條件是先在命名空間上啟用系統指派身分,並在自訂主題上將 Event Grid 資料傳送者 角色指派給系統指派身分。
    • 使用者指派身份: 先在命名空間啟用使用者指派身份 作為前提,並將事件 網格資料發送 者角色指派給自訂主題中所選身份。 如果你選擇 使用者指派身份,會出現一個下拉選單,讓你可以選擇該身份。
  6. 選取 ,然後套用。

透過入口網站顯示路由設定的截圖。

關於擴充配置的說明,請前往擴充 平台設置。

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",
                "userAssignedIdentity": "/subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<User-assigned identity>"
            }
        }
    }
}

在 routingIdentityInfo中, type 接受 None、 SystemAssigned或 UserAssigned。 僅當 UserAssigned 為 userAssignedIdentity 時,才設定 type。

關於增強配置的設定說明,請前往 增強 CLI 配置。

MQTT 訊息路由行為

在將 MQTT 訊息路由至自訂主題時,Event Grid 提供持久傳遞,因為它嘗試至少立即送達每則訊息 一次 。 如果發生失敗,事件網格會重試傳送或丟棄原本要用來路由的訊息。 Event Grid不保證事件傳遞的順序,因此訂閱者可能會接收到無序的事件。

下表說明根據不同錯誤,MQTT 訊息路由的行為。

錯誤 錯誤描述 行為
主題未找到錯誤 原本設定接收所有 MQTT 路由訊息的自訂主題已被刪除。 Event Grid 會丟棄原本用於路由的 MQTT 訊息。
認證錯誤 設定為 MQTT 路由訊息目的地的自訂主題的事件網格資料發送者角色已被刪除。 Event Grid 會丟棄原本用於路由的 MQTT 訊息。
請求過多 每秒 MQTT 路由訊息數量超過自訂主題的發佈限制。 Event Grid 會重新嘗試路由 MQTT 訊息。
服務錯誤 伺服器因操作原因而發生的意外錯誤。 Event Grid 會重新嘗試路由 MQTT 訊息。

在重試時,Event Grid 會使用指數退避重試策略來執行 MQTT 訊息路由。 事件方格會依下列排程以盡力而為的方式重試傳遞:

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

如果一個已路由的 MQTT 訊息在等待重投時成功,Event Grid 會嘗試以最佳方式將該訊息從重試隊列中移除,但你仍可能收到重複訊息。