Durable Functions 中的函式鏈結- Hello 序列範例

函式鏈結是指以特定順序執行一連串函式的模式。 通常,一個函式的輸出必須套用至另一個函式的輸入。 本文說明當您完成 C#JavaScript、TypeScriptPythonPowerShellJAVA) Durable Functions (快速入門時所建立的鏈結順序。 如需 Durable Functions 的詳細資訊,請參閱 Durable Functions 概觀

Prerequisites

注意

Azure Functions Node.js 程式設計模型的第 4 版正式推出。 新的 v4 模型是設計來為 JavaScript 和 TypeScript 開發人員提供更具彈性且直覺的體驗。 在 移轉指南中深入瞭解 v3 和 v4 之間的差異。

在下列程式碼片段中,JavaScript (PM4) 表示程式設計模型 V4,這是新的體驗。

函式

本文說明範例應用程式中的函式如下:

  • E1_HelloSequence:連續呼叫 E1_SayHello 多次的協調器函式。 它會儲存 E1_SayHello 呼叫的輸出,並記錄結果。
  • E1_SayHello:在字串前面加上「Hello」的活動函式
  • HttpStart:HTTP 觸發的 耐久性用戶端函式,可啟動協調器的執行個體。

E1_HelloSequence 協調器函式

[FunctionName("E1_HelloSequence")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello_DirectInput", "London"));

    // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
    return outputs;
}

所有 C# 協調流程函式都必須有 DurableOrchestrationContext 類型的參數 (在 Microsoft.Azure.WebJobs.Extensions.DurableTask 組件中)。 此內容物件可讓您使用其 CallActivityAsync 方法來呼叫其他「活動」函式並傳遞輸入參數。

程式碼中以不同的參數值連續呼叫 E1_SayHello 三次。 每次呼叫的傳回值會新增至函式最後傳回的 outputs 清單。

E1_SayHello 活動函式

[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext context)
{
    string name = context.GetInput<string>();
    return $"Hello {name}!";
}

活動會使用 ActivityTrigger 屬性。 使用提供的 IDurableActivityContext 來執行活動相關動作,例如使用 GetInput<T> 來存取輸入值。

E1_SayHello 的實作是相當簡單的字串格式化作業。

您可以直接繫結至傳遞至活動函式的類型,而不是繫結至 IDurableActivityContext。 例如:

[FunctionName("E1_SayHello_DirectInput")]
public static string SayHelloDirectInput([ActivityTrigger] string name)
{
    return $"Hello {name}!";
}

HttpStart 用戶端函式

您可以使用用戶端函式來啟動協調器函式的執行個體。 您將使用 HTTP 觸發的 HttpStart 函式來啟動 E1_HelloSequence 的執行個體。

public static class HttpStart
{
    [FunctionName("HttpStart")]
    public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}")] HttpRequestMessage req,
        [DurableClient] IDurableClient starter,
        string functionName,
        ILogger log)
    {
        // Function input comes from the request content.
        object eventData = await req.Content.ReadAsAsync<object>();
        string instanceId = await starter.StartNewAsync(functionName, eventData);

        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

        return starter.CreateCheckStatusResponse(req, instanceId);
    }
}

若要與協調器互動,函式必須包含 DurableClient 輸入繫結。 您可以使用用戶端來啟動協調流程。 這也可以協助您傳回包含 URL 的 HTTP 回應,以檢查新協調流程的狀態。

執行範例

若要執行 E1_HelloSequence 協調流程,請將下列 HTTP POST 要求傳送至 HttpStart 函式。

POST http://{host}/orchestrators/E1_HelloSequence

注意

先前的 HTTP 程式碼片段假設 host.json 檔案中有一個項目會從所有的 HTTP 觸發程序函式 URL 中移除預設 api/ 前置詞。 您可以在範例的 host.json 檔案中找到此組態的標記。

例如,如果您在名為 "myfunctionapp" 的函式應用程式中執行範例,請將 "{host}" 取代為 "myfunctionapp.azurewebsites.net"。

結果會是 HTTP 202 回應,就像這樣 (為了簡潔起見已修剪):

HTTP/1.1 202 Accepted
Content-Length: 719
Content-Type: application/json; charset=utf-8
Location: http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

(...trimmed...)

現在,協調流程已排入佇列,並立即開始執行。 Location 標頭中的 URL 可以用來檢查執行的狀態。

GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

結果會是協調流程的狀態。 執行和完成都很快速,您會看到 Completed 狀態,而且回應看起來像這樣 (為了簡潔起見已修剪):

HTTP/1.1 200 OK
Content-Length: 179
Content-Type: application/json; charset=utf-8

{"runtimeStatus":"Completed","input":null,"output":["Hello Tokyo!","Hello Seattle!","Hello London!"],"createdTime":"2017-06-29T05:24:57Z","lastUpdatedTime":"2017-06-29T05:24:59Z"}

如您所見,執行個體的 runtimeStatusCompleted,而 output 包含協調器函式執行的 JSON 序列化結果。

注意

您可以對其他觸發程序類型實作類似的起始邏輯,例如 queueTriggereventHubTriggertimerTrigger

查看函式執行記錄。 因為協調流程可靠性主題中所述的重新執行行為,所以函式已啟動並完成多次。E1_HelloSequence 相反地,E1_SayHello 只執行三次,因為這幾次函式執行不會再來一次。

後續步驟

此範例已示範簡單的函式鏈結協調流程。 下一個範例會說明如何實作展開傳送/收合傳送模式。