Durable Functions の関数の種類と機能の概要 (Azure Functions)Overview of function types and features for Durable Functions (Azure Functions)

Azure Durable Functions は、関数実行のステートフル オーケストレーションを提供します。Azure Durable Functions provides stateful orchestration of function execution. Durable Functions はさまざまな Azure Functions から構成されるソリューションです。A durable function is a solution made up of different Azure Functions. それぞれの関数がオーケストレーションの一部として異なる役割を果たすことができます。Each of these functions can play different roles as part of an orchestration. 次のドキュメントでは、Durable Functions オーケストレーションに含まれる関数の種類の概要を示します。The following document provides an overview of the types of functions involved in a durable function orchestration. 関数を組み合わせるときの一般的なパターンもいくつか含まれています。It also includes some common patterns in connecting functions together.

Durable Functions の種類

関数の種類Types of functions

アクティビティ関数Activity functions

アクティビティ関数は、Durable Functions オーケストレーションの基本作業単位です。Activity functions are the basic unit of work in a durable orchestration. アクティビティ関数は、プロセスでオーケストレーションされる関数とタスクです。Activity functions are the functions and tasks being orchestrated in the process. たとえば、注文を処理する、つまり、在庫を確認し、顧客に代金を請求し、出荷を手配する Durable Functions を作成できます。For example, you may create a durable function to process an order - check the inventory, charge the customer, and create a shipment. そのようなタスクはいずれもアクティビティ関数です。Each one of those tasks would be an activity function. アクティビティ関数には、その中でできる作業の種類について制限がありません。Activity functions don't have any restrictions in the type of work you can do in them. Azure Functions でサポートされているあらゆる言語で記述できます。They can be written in any language supported by Azure Functions. 持続的タスク フレームワークによって、呼び出された各アクティビティ関数が、オーケストレーションの間、少なくとも 1 回実行されます。The durable task framework guarantees that each called activity function will be executed at least once during an orchestration.

アクティビティ関数はアクティビティ トリガーによって始動させる必要があります。An activity function must be triggered by an activity trigger. この関数はパラメーターとして DurableActivityContext を受け取ります。This function will receive a DurableActivityContext as a parameter. トリガーを他のオブジェクトにバインドし、入力を関数に渡すこともできます。You can also bind the trigger to any other object to pass in inputs to the function. アクティビティ関数はオーケストレーターに値を返すこともできます。Your activity function can also return values back to the orchestrator. アクティビティ関数からたくさんの値を送信したり、返したりする場合、タプルや配列を活用できます。If sending or returning many values from an activity function, you can leverage tuples or arrays. アクティビティ関数は、オーケストレーション インスタンスからのみトリガーさせることができます。Activity functions can only be triggered from an orchestration instance. 一部のコードはアクティビティ関数と別の関数 (HTTP でトリガーした関数など) の間で共有できますが、各関数に与えられるトリガーは 1 つに限られます。While some code may be shared between an activity function and another function (like an HTTP triggered function), each function can only have one trigger.

詳細とサンプルは、Durable Functions のバインディングに関するこちらの記事にあります。More information and examples can be found in the Durable Functions binding article.

オーケストレーター関数Orchestrator functions

オーケストレーター関数は、Durable Functions の中核です。Orchestrator functions are the heart of a durable function. オーケストレーター関数は、アクションが実行される方法と順序を表現します。Orchestrator functions describe the way and order actions are executed. オーケストレーター関数は、「Durable Functions の概要」にあるように、コード (C# または JavaScript) でオーケストレーションを表現します。Orchestrator functions describe the orchestration in code (C# or JavaScript) as shown in the durable functions overview. 1 つのオーケストレーションに、アクティビティ関数サブオーケストレーション外部イベントの待ち受けタイマーなど、さまざまな種類のアクションを設定できます。An orchestration can have many different types of actions, like activity Functions, sub-orchestrations, waiting for external events, and timers.

オーケストレーター関数はオーケストレーション トリガーによって始動させる必要があります。An orchestrator function must be triggered by an orchestration trigger.

オーケストレーターはオーケストレーター クライアントによって開始されます。オーケストレーター クライアント自体はあらゆるソース (HTTP、キュー、イベント ストリーム) からトリガーされます。An orchestrator is started by an orchestrator client which could itself be triggered from any source (HTTP, queues, event streams). オーケストレーションの各インスタンスにはインスタンス ID が与えられます。この ID の生成には自動生成 (推奨) とユーザー生成があります。Each instance of an orchestration has an instance identifier, which can be auto-generated (recommended) or user-generated. この ID はオーケストレーションのインスタンス管理に利用できます。This identifier can be used to manage instances of the orchestration.

詳細とサンプルは、Durable Functions のバインディングに関するこちらの記事にあります。More information and examples can be found in the Durable Functions binding article.

クライアント関数Client functions

クライアント関数はトリガーされる関数であり、オーケストレーションの新しいインスタンスを作成します。Client functions are the triggered functions that will create new instances of an orchestration. 持続的オーケストレーションのインスタンス作成のエントリ ポイントです。They are the entry point for creating an instance of a durable orchestration. クライアント関数はあらゆるトリガー (HTTP、キュー、イベント ストリームなど) で始動させることができます。また、アプリでサポートされているあらゆる言語で記述できます。Client functions can be triggered by any trigger (HTTP, queues, event streams, etc.) and written in any language supported by the app. トリガーに加え、クライアント関数にはオーケストレーション クライアント バインディングを設定できます。これにより、クライアント関数で持続的オーケストレーションを作成し、管理できます。In addition to the trigger, client functions have an orchestration client binding that allows them to create and manage durable orchestrations. クライアント関数の最も基本的な例は、このサンプルのように、オーケストレーター関数を開始し、状態確認応答を返す HTTP トリガーの関数です。The most basic example of a client function is an HTTP triggered function that starts an orchestrator function and returns a check status response as shown in this following example.

詳細とサンプルは、Durable Functions のバインディングに関するこちらの記事にあります。More information and examples can be found in the Durable Functions binding article.

機能とパターンFeatures and patterns

サブオーケストレーションSub-orchestrations

オーケストレーター関数はアクティビティ関数を呼び出すだけでなく、別のオーケストレーター関数を呼び出すことができます。In addition to calling activity functions, orchestrator functions can call other orchestrator functions. たとえば、オーケストレーター関数のライブラリから大規模なオーケストレーションを作成できます。For example, you can build a larger orchestration out of a library of orchestrator functions. またはオーケストレーター関数の複数のインスタンスを並列で実行できます。Or you can run multiple instances of an orchestrator function in parallel.

詳細とサンプルは、サブオーケストレーションに関するこちらの記事にあります。More information and examples can be found in the sub-orchestration article.

持続的タイマーDurable timers

Durable Functions には、遅延を実装したり、非同期アクションでタイムアウトを設定したりできるように、オーケストレーター関数で使用する "持続的タイマー" が用意されています。Durable Functions provides durable timers for use in orchestrator functions to implement delays or to set up timeouts on async actions. 持続的タイマーは、Thread.Sleep および Task.Delay (C#)、または setTimeout() および setInterval() (JavaScript) の代わりに、オーケストレーター関数で使用されます。Durable timers should be used in orchestrator functions instead of Thread.Sleep and Task.Delay (C#), or setTimeout() and setInterval() (JavaScript).

持続的タイマーの詳細とサンプルは、持続的タイマーに関するこちらの記事にあります。More information and examples of durable timers can be found in the durable timers article

外部イベントExternal events

オーケストレーター関数は、オーケストレーション インスタンスを更新するために、外部イベントを待ち受けできます。Orchestrator functions can wait for external events to update an orchestration instance. Durable Functions のこの機能は、多くの場合、人による操作または他の外部コールバックを処理するときに便利です。This feature of Durable Functions is often useful for handling human interaction or other external callbacks.

詳細とサンプルは、外部イベントに関するこちらの記事にあります。More information and examples can be found in the external events article.

エラー処理Error handling

Durable Function のオーケストレーションはコードで実装され、プログラミング言語のエラー処理機能を使用できます。Durable Function orchestrations are implemented in code and can use the error-handling features of the programming language. つまり、"try/catch" のようなパターンがオーケストレーションで機能します。This means patterns like "try/catch" will work in your orchestration. Durable Functions には再試行ポリシーがいくつか組み込まれています。Durable functions also come with some built-in retry policies. 例外時、アクションは自動的にアクティビティを遅らせたり、再試行したりできます。An action can delay and retry activities automatically on exceptions. 再試行では、オーケストレーションを破棄することなく、一時的な例外を処理できます。Retries allow you to handle transient exceptions without having to abandon the orchestration.

詳細とサンプルは、エラー処理に関するこちらの記事にあります。More information and examples can be found in the error handling article.

関数アプリ間の通信Cross-function app communication

持続的オーケストレーションは一般的に 1 つの関数アプリ内で存続しますが、さまざまな関数アプリ間でオーケストレーションを調整できるパターンがあります。While a durable orchestration generally lives within a context of a single function app, there are patterns to enable you to coordinate orchestrations across many function apps. アプリ間通信は HTTP で行われることがありますが、各アクティビティに持続的フレームワークを使用するということは、2 つのアプリ間で持続的プロセスを維持できることを意味します。Even though cross-app communication may be happening over HTTP, using the durable framework for each activity means you can still maintain a durable process across two apps.

C# の関数アプリ間オーケストレーションの例を下に示します。An example of a cross-function app orchestration in C# is provided below. 1 つのアクティビティが外部オーケストレーションを開始します。One activity will start the external orchestration. 別のアクティビティが状態を取得して返します。Another activity will then retrieve and return the status. オーケストレーターは状態の完了を待ってから続行します。The orchestrator will wait for the status to be complete before continuing.

[FunctionName("OrchestratorA")]
public static async Task RunRemoteOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext context)
{
    // Do some work...

    // Call a remote orchestration
    string statusUrl = await context.CallActivityAsync<string>(
        "StartRemoteOrchestration", "OrchestratorB");

    // Wait for the remote orchestration to complete
    while (true)
    {
        bool isComplete = await context.CallActivityAsync<bool>("CheckIsComplete", statusUrl);
        if (isComplete)
        {
            break;
        }

        await context.CreateTimer(context.CurrentUtcDateTime.AddMinutes(1), CancellationToken.None);
    }

    // B is done. Now go do more work...
}

[FunctionName("StartRemoteOrchestration")]
public static async Task<string> StartRemoteOrchestration([ActivityTrigger] string orchestratorName)
{
    using (var response = await HttpClient.PostAsync(
        $"https://appB.azurewebsites.net/orchestrations/{orchestratorName}",
        new StringContent("")))
    {
        string statusUrl = await response.Content.ReadAsAsync<string>();
        return statusUrl;
    }
}

[FunctionName("CheckIsComplete")]
public static async Task<bool> CheckIsComplete([ActivityTrigger] string statusUrl)
{
    using (var response = await HttpClient.GetAsync(statusUrl))
    {
        // 200 = Complete, 202 = Running
        return response.StatusCode == HttpStatusCode.OK;
    }
}

次の手順Next steps