Share via


發佈至 Azure 事件方格的 Durable Functions

本文說明如何設定 Durable Functions,將協調流程生命週期事件 (例如已建立、已完成和失敗) 發佈至自訂 Azure 事件方格主題

以下是適合使用此功能的一些案例:

  • 類似 DevOps 案例的藍色/綠色部署:您可能想知道在實作並存部署策略前是否有任何工作正在執行中。

  • 進階監視和診斷支援:您可以在已針對查詢最佳化的外部存放區 (例如 Azure SQL Database 或 Azure Cosmos DB) 中,追蹤協調流程狀態資訊。

  • 長時間執行的背景活動:如果您使用 Durable Functions 進行長時間執行的背景活動,這項功能可協助您知道目前的狀態。

必要條件

建立自訂事件方格主題

從 Durable Functions 建立可供傳送事件的事件方格主題。 下列指示說明如何使用 Azure CLI 建立主題。 您也可以使用 PowerShell 或使用 Azure 入口網站來建立主題。

建立資源群組

使用 az group create 命令建立資源群組。 Azure 事件方格目前不支援所有區域。 如需支援區域的相關資訊,請參閱 Azure 事件方格概觀

az group create --name eventResourceGroup --location westus2

建立自訂主題

事件方格主題會提供使用者定義的端點,作為您發佈事件的目的地。 以主題的唯一名稱取代 <topic_name>。 主題名稱必須是唯一的,因為它會變成 DNS 項目。

az eventgrid topic create --name <topic_name> -l westus2 -g eventResourceGroup

取得端點和金鑰

取得主題的端點。 使用您所選的名稱取代 <topic_name>

az eventgrid topic show --name <topic_name> -g eventResourceGroup --query "endpoint" --output tsv

取得主題金鑰。 使用您所選的名稱取代 <topic_name>

az eventgrid topic key list --name <topic_name> -g eventResourceGroup --query "key1" --output tsv

您現在可以將事件傳送至主題。

設定 Azure 事件方格發佈

在 Durable Functions 專案中,尋找 host.json 檔案。

Durable Functions 1.x

durableTask 屬性中新增 eventGridTopicEndpointeventGridKeySettingName

{
  "durableTask": {
    "eventGridTopicEndpoint": "https://<topic_name>.westus2-1.eventgrid.azure.net/api/events",
    "eventGridKeySettingName": "EventGridKey"
  }
}

Durable Functions 2.x

notifications 區段新增至檔案的 durableTask 屬性,並以您選擇的名稱取代 <topic_name>。 如果 durableTaskextensions 屬性不存在,請加以建立,如下列範例所示:

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "notifications": {
        "eventGrid": {
          "topicEndpoint": "https://<topic_name>.westus2-1.eventgrid.azure.net/api/events",
          "keySettingName": "EventGridKey"
        }
      }
    }
  }
}

您可以在 host.json 文件中找到可能的 Azure 事件方格設定屬性。 設定 host.json 檔案之後,您的函式應用程式會將生命週期事件傳送至事件方格主題。 此動作會於您在本機和 Azure 中執行函式應用程式時開始。

在函式應用程式和 local.settings.json 中設定主題索引鍵的應用程式設定。 以下 JSON 是使用 Azure 儲存體模擬器進行本機偵錯的 local.settings.json 範例。 以主題索引鍵取代 <topic_key>

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "EventGridKey": "<topic_key>"
    }
}

如果您使用儲存體模擬器,而不是實際的 Azure 儲存體帳戶,請確定其正在執行。 最好在執行之前清除任何現有的儲存體資料。

如果您使用實際的 Azure 儲存體帳戶,請使用其連接字串取代 local.settings.json 中的 UseDevelopmentStorage=true

建立可接聽事件的函式

使用 Azure 入口網站,建立另一個函式應用程式來接聽 Durable Functions 應用程式所發佈的事件。 函式的位置最好在與事件方格主題的相同區域。

建立事件方格觸發程序函式

  1. 在您的函式應用程式下,選取 [函數],然後選取 [+ 新增]

    Add a function in the Azure portal.

  2. 搜尋 [事件方格],然後選取 Azure 事件方格觸發程序範本。

    Select the event grid trigger template in the Azure portal.

  3. 將新的觸發程式命名,然後選取 [建立函式]

    Name the event grid trigger in the Azure portal.

    隨即建立具有下列程式碼的函式:

    #r "Newtonsoft.Json"
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using Microsoft.Extensions.Logging;
    
    public static void Run(JObject eventGridEvent, ILogger log)
    {
        log.LogInformation(eventGridEvent.ToString(Formatting.Indented));
    }
    

新增事件方格訂用帳戶

您現在可以為所建立的事件方格主題新增事件方格訂用帳戶。 如需詳細資訊,請參閱 Azure 事件方格概念

  1. 在您的新函式中,選取 [整合],然後選取 [事件方格觸發程式 (eventGridEvent)]

    Select the Event Grid Trigger link.

  2. 選取 [建立事件方格描述]

    Create the Event Grid subscription.

  3. 為您的事件訂用帳戶命名,並選取 [事件方格主題] 主題類型。

  4. 選取訂用帳戶。 然後,選取您為事件方格主題所建立的資源群組和資源。

  5. 選取 建立

    Create an Event Grid subscription.

您現在已經準備好接收生命週期事件。

執行 Durable Functions 應用程式以傳送事件

在您稍早設定的 Durable Functions 專案中,開始在本機電腦上進行偵錯並啟動協調流程。 應用程式會將 Durable Functions 生命週期事件發佈到事件方格。 確認事件方格會在 Azure 入口網站中檢查其記錄,以觸發您所建立的接聽程式函式。

2019-04-20T09:28:21.041 [Info] Function started (Id=3301c3ef-625f-40ce-ad4c-9ba2916b162d)
2019-04-20T09:28:21.104 [Info] {
    "id": "054fe385-c017-4ce3-b38a-052ac970c39d",
    "subject": "durable/orchestrator/Running",
    "data": {
        "hubName": "DurableFunctionsHub",
        "functionName": "Sample",
        "instanceId": "055d045b1c8a415b94f7671d8df693a6",
        "reason": "",
        "runtimeStatus": "Running"
    },
    "eventType": "orchestratorEvent",
    "eventTime": "2019-04-20T09:28:19.6492068Z",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "topic": "/subscriptions/<your_subscription_id>/resourceGroups/eventResourceGroup/providers/Microsoft.EventGrid/topics/durableTopic"
}

2019-04-20T09:28:21.104 [Info] Function completed (Success, Id=3301c3ef-625f-40ce-ad4c-9ba2916b162d, Duration=65ms)
2019-04-20T09:28:37.098 [Info] Function started (Id=36fadea5-198b-4345-bb8e-2837febb89a2)
2019-04-20T09:28:37.098 [Info] {
    "id": "8cf17246-fa9c-4dad-b32a-5a868104f17b",
    "subject": "durable/orchestrator/Completed",
    "data": {
        "hubName": "DurableFunctionsHub",
        "functionName": "Sample",
        "instanceId": "055d045b1c8a415b94f7671d8df693a6",
        "reason": "",
        "runtimeStatus": "Completed"
    },
    "eventType": "orchestratorEvent",
    "eventTime": "2019-04-20T09:28:36.5061317Z",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "topic": "/subscriptions/<your_subscription_id>/resourceGroups/eventResourceGroup/providers/Microsoft.EventGrid/topics/durableTopic"
}
2019-04-20T09:28:37.098 [Info] Function completed (Success, Id=36fadea5-198b-4345-bb8e-2837febb89a2, Duration=0ms)

事件結構描述

下列清單說明生命週期事件結構描述︰

  • id:事件方格事件的唯一識別碼。
  • subject:事件主體的路徑。 durable/orchestrator/{orchestrationRuntimeStatus}. {orchestrationRuntimeStatus} 會是 RunningCompletedFailedTerminated
  • data:Durable Functions 專屬參數。
    • hubNameTaskHub 名稱。
    • functionName:協調器函式名稱。
    • instanceId:Durable Functions 執行個體識別碼。
    • reason:與追蹤事件相關聯的其他資料。 如需詳細資訊,請參閱 Durable Functions 中的診斷 (Azure Functions)
    • runtimeStatus:協調流程執行階段狀態。 執行中、已完成、失敗、已取消。
  • eventType:"orchestratorEvent"
  • eventTime:事件時間 (UTC)。
  • dataVersion:生命週期事件結構描述的版本。
  • metadataVersion:中繼資料的版本。
  • topic:事件方格主題資源。

本機測試方式

若要在本機進行測試,請參閱使用檢視器 Web 應用程式的本機測試。 您也可以使用 ngrok 公用程式,如本教學課程所示。

下一步