Durable Functions での関数チェーン - Hello シーケンス サンプルFunction chaining in Durable Functions - Hello sequence sample

関数チェーンとは、特定の順序で一連の関数を実行するパターンです。Function chaining refers to the pattern of executing a sequence of functions in a particular order. ある関数の出力が、別の関数の入力に適用される必要がある、ということがよくあります。Often the output of one function needs to be applied to the input of another function. この記事では、Durable Functions のクイックスタート (C# または JavaScript) を実行するときに作成するチェーンのシーケンスについて説明します。This article describes the chaining sequence that you create when you complete the Durable Functions quickstart (C# or JavaScript). Durable Functions について詳しくは、「Durable Functions overview」(Durable Functions の概要) をご覧ください。For more information about Durable Functions, see Durable Functions overview.

前提条件Prerequisites

関数The functions

この記事では、サンプル アプリで使用されている次の関数について説明します。This article explains the following functions in the sample app:

  • E1_HelloSequence:1 つの オーケストレーター機能。1 つのシーケンスで E1_SayHello を複数回呼び出します。E1_HelloSequence: An orchestrator function that calls E1_SayHello multiple times in a sequence. E1_SayHello 呼び出しからの出力を格納し、結果を記録します。It stores the outputs from the E1_SayHello calls and records the results.
  • E1_SayHello:文字列の先頭に "Hello" を付加する アクティビティ関数E1_SayHello: An activity function that prepends a string with "Hello".
  • HttpStart:オーケストレーターのインスタンスを起動する HTTP によってトリガーされる関数。HttpStart: An HTTP triggered function that starts an instance of the orchestrator.

E1_HelloSequence オーケストレーター関数E1_HelloSequence orchestrator function

[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# オーケストレーション関数は、Microsoft.Azure.WebJobs.Extensions.DurableTask アセンブリにある DurableOrchestrationContext 型のパラメーターを持つ必要があります。All C# orchestration functions must have a parameter of type DurableOrchestrationContext, which exists in the Microsoft.Azure.WebJobs.Extensions.DurableTask assembly. このコンテキスト オブジェクトでは、他のアクティビティ関数を呼び出し、その CallActivityAsync メソッドを使用して入力パラメーターを渡すことができます。This context object lets you call other activity functions and pass input parameters using its CallActivityAsync method.

このコードでは、E1_SayHello を異なるパラメーター値で 3 回続けて呼び出します。The code calls E1_SayHello three times in sequence with different parameter values. 各呼び出しの戻り値が outputs 一覧に追加され、それが関数の末尾に返されます。The return value of each call is added to the outputs list, which is returned at the end of the function.

E1_SayHello アクティビティ関数E1_SayHello activity function

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

アクティビティは、ActivityTrigger 属性を使用します。Activities use the ActivityTrigger attribute. 指定された IDurableActivityContext を使用して、GetInput<T> を使用した入力値へのアクセスなど、アクティビティ関連のアクションを実行します。Use the provided IDurableActivityContext to perform activity related actions, such as accessing the input value using GetInput<T>.

E1_SayHello の実装は、比較的単純な文字列の書式設定操作です。The implementation of E1_SayHello is a relatively trivial string formatting operation.

IDurableActivityContextにバインドする代わりに、アクティビティ関数に渡される型に直接バインドすることができます。Instead of binding to an IDurableActivityContext, you can bind directly to the type that is passed into the activity function. 次に例を示します。For example:

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

HttpStart クライアント関数HttpStart client function

オーケストレーター関数のインスタンスを開始するには、クライアント関数を使用します。You can start an instance of orchestrator function using a client function. E1_HelloSequence のインスタンスを開始するには、HttpStart HTTP によってトリガーされる関数を使用します。You will use the HttpStart HTTP triggered function to start instances of 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 入力バインドが含まれている必要があります。To interact with orchestrators, the function must include a DurableClient input binding. クライアントを使用して、オーケストレーションを開始します。You use the client to start an orchestration. また、新しいオーケストレーションの状態を確認するための URL を含む HTTP 応答を返すこともできます。It can also help you return an HTTP response containing URLs for checking the status of the new orchestration.

サンプルを実行するRun the sample

E1_HelloSequence オーケストレーションを実行するには、次の HTTP POST 要求を HttpStart 関数に送信します。To execute the E1_HelloSequence orchestration, send the following HTTP POST request to the HttpStart function.

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

注意

前の HTTP スニペットでは、既定の api/ プレフィックスをすべての HTTP トリガー関数 URL から削除するエントリが host.json ファイルにあることを想定しています。The previous HTTP snippet assumes there is an entry in the host.json file which removes the default api/ prefix from all HTTP trigger functions URLs. この構成のマークアップはサンプルの host.json ファイルにあります。You can find the markup for this configuration in the host.json file in the samples.

たとえば、"myfunctionapp" という関数アプリのサンプルを実行する場合、"{host}" を "myfunctionapp.azurewebsites.net" に置き換えます。For example, if you're running the sample in a function app named "myfunctionapp", replace "{host}" with "myfunctionapp.azurewebsites.net".

結果は次のような HTTP 202 応答です (簡潔にするため省略しています)。The result is an HTTP 202 response, like this (trimmed for brevity):

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...)

この時点で、オーケストレーションはキューに登録され、すぐに実行を開始します。At this point, the orchestration is queued up and begins to run immediately. Location ヘッダー内の URL は、実行状態を確認するのに使用できます。The URL in the Location header can be used to check the status of the execution.

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

この結果がオーケストレーションの状態です。The result is the status of the orchestration. 迅速に実行して完了し、次のような応答で完了状態にあることがわかります(簡潔にするため省略しています)。It runs and completes quickly, so you see it in the Completed state with a response that looks like this (trimmed for brevity):

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"}

このように、インスタンスの runtimeStatus完了しており、output は orchestrator 関数の実行の JSON でシリアル化された結果を格納します。As you can see, the runtimeStatus of the instance is Completed and the output contains the JSON-serialized result of the orchestrator function execution.

注意

同様のスターター ロジックを queueTriggereventHubTriggertimerTrigger などの他のトリガーの種類に実装することができます。You can implement similar starter logic for other trigger types, like queueTrigger, eventHubTrigger, or timerTrigger.

関数の実行ログを確認しましょう。Look at the function execution logs. E1_HelloSequence 関数が、オーケストレーションの信頼性に関するトピックで説明されている再生の動作のため、複数回、開始し完了しています。The E1_HelloSequence function started and completed multiple times due to the replay behavior described in the orchestration reliability topic. その一方で、E1_SayHello の実行は 3 回だけでした。これらの関数の実行は再生されなかったためです。On the other hand, there were only three executions of E1_SayHello since those function executions do not get replayed.

次のステップNext steps

このサンプルでは、単純な関数チェーンのオーケストレーションについて説明しました。This sample has demonstrated a simple function-chaining orchestration. 次のサンプルでは、ファンアウト/ファンイン パターンの実装方法について説明します。The next sample shows how to implement the fan-out/fan-in pattern.