Durable Functionsは、ステートフル オーケストレーション機能を関数アプリに追加する Azure Functions の拡張機能です。 Durable Functions アプリは、オーケストレーター、アクティビティ、エンティティ、またはクライアントという特定の役割を果たすさまざまなAzure関数で構成されます。 これらのロールは、Durable Functions拡張機能が提供する特殊なトリガー型とバインド型に対応します。
Durable Task SDK を使用すると、任意のコンピューティング プラットフォームでステートフルでフォールト トレラントなアプリケーションを構築できます。 アプリでは、オーケストレーター、アクティビティ、エンティティをワーカーに登録するクラスまたは関数として定義します。 個別のクライアント API を使用すると、オーケストレーション インスタンスを開始および管理できます。
次の表は、主要なプログラミング コンポーネントとその役割をまとめたものです。
| コンポーネント | 役割 | によって定義される |
|---|---|---|
| オーケストレーター | ワークフロー ロジックを調整する | オーケストレーション トリガー |
| アクティビティ | 1 つの作業単位を実行します | アクティビティ トリガー |
| エンティティ | 小規模なステートを管理します | エンティティ トリガー |
| クライアント | オーケストレーションとエンティティを開始および管理する | 永続的なクライアント バインド |
| コンポーネント | 役割 | によって定義される |
|---|---|---|
| オーケストレーター | ワークフロー ロジックを調整する | ワーカーに登録されているクラスまたは関数 |
| アクティビティ | 1 つの作業単位を実行します | ワーカーに登録されているクラスまたは関数 |
| エンティティ | 小さなステートを管理します | ワーカーに登録済みのクラス |
| クライアント | オーケストレーションとエンティティを開始および管理する | API |
オーケストレーター
オーケストレーターはワークフローを定義します。実行するアクション、順序、結果の処理方法です。 オーケストレーター ロジックは、ループ、条件、try/catch ブロックなどの標準の制御フロー コンストラクトを使用して、通常のコードとして記述します。
オーケストレーターは、いくつかの種類のタスクをスケジュールできます。
- 作業 を実行するためのアクティビティ
- 小さいワークフローを作成するためのサブオーケストレーション
- 遅延とタイムアウトのための持続的タイマー
- オーケストレーションの外部からのシグナルを待機するための外部イベント
オーケストレーターは 、エンティティと対話することもできます。
Durable Functionsでは、orchestration トリガー バインドを使用してオーケストレーターを定義します。 トリガーは、タスクのスケジュール設定と結果の受信に使用するコンテキスト オブジェクトを提供します。
Durable Task SDK では、オーケストレーターを定義するには、クラスまたは関数を実装し、Durable Task worker に登録します。 オーケストレーターは、タスクのスケジュール設定と結果の受信に使用するコンテキスト オブジェクトを受け取ります。
Important
オーケストレーター コードは 決定論的である必要があります。 Durable Task ランタイムは 、イベント ソーシングと再生を 使用してオーケストレーターの状態を再構築するため、非決定的コードによってエラーやデッドロックが発生する可能性があります。 詳細なガイダンスについては、 Orchestrator コードの制約に関する記事を参照してください。
再生、インスタンス ID、エラー処理など、オーケストレーターの動作の完全な概要については、 Durable オーケストレーションに関するページを参照してください。
アクティビティ
アクティビティは、持続的オーケストレーションの基本的な作業単位です。 通常、各アクティビティは、Web API の呼び出し、データベースへの書き込み、結果の計算など、1 つのタスクを表します。 オーケストレーターはアクティビティを呼び出して実際の作業を行います。
アクティビティは、主な方法でオーケストレーターとは異なります。
- コードの制限はありません。 オーケストレーターは決定論的である必要がありますが、アクティビティは、非決定的または実行時間の長い操作を含め、任意のコードを実行できます。
- 少なくとも 1 回の実行。 ランタイムは、オーケストレーション中に各アクティビティが 少なくとも 1 回 実行されることを保証します。 アクティビティが完了した後、結果が記録される前にエラーが発生した場合は、ランタイムによって再実行される可能性があります。
- 1 つの責任。 各アクティビティは 1 つの入力を受け取り、1 つの出力を返します。 複数の値を渡すには、複合型またはコレクションを使用します。
アクティビティ関数は、 アクティビティ トリガー バインドを使用して定義します。 トリガーは、オーケストレーターがアクティビティをスケジュールするときに渡した入力を提供します。
アクティビティを定義するには、クラスまたは関数を実装し、Durable Task worker に登録します。 このアクティビティは、オーケストレーターがスケジュール時に渡した入力を受け取ります。
注
アクティビティでは少なくとも 1 回は実行されることが保証されるため、可能な限りアクティビティ ロジックをべき等性にします。 たとえば、挿入の代わりに "upserts" を使用するか、新しいリソースを作成する前に既存の結果を確認します。
アクティビティは、 順次、 並列、または両方の組み合わせで実行できます。
Entities
エンティティは、小規模で永続的な状態を管理します。 各エンティティには、一意の ID と、その内部状態を読み取ったり更新したりできる名前付き操作のセットがあります。 エンティティはオーケストレーターとは異なり、制御フローを通じて暗黙的にではなく、操作を通じて状態を明示的に管理します。 また、オーケストレーターとは異なり、同じコード制限はありません。エンティティ操作では、非決定的な操作や実行時間の長い操作を含め、任意のコードを実行できます。
エンティティの一般的な用途は次のとおりです。
- 複数のソースからのデータの集計
- 分散ロックまたはセマフォの実装
- ショッピング カートやゲーム セッションなどのステートフル オブジェクトのモデル化
エンティティは、操作を順次実行します。特定のエンティティ インスタンスに対して一度に実行される操作は 1 つだけです。 このシリアル実行により、明示的なロックを必要とせずにコンカレンシーの競合を防ぐことができます。
エンティティ関数は、 エンティティ トリガー バインドを使用して定義します。
注
エンティティ関数は、.NET、JavaScript/TypeScript、Python、およびJavaでサポートされていますが、PowerShell ではサポートされていません。
エンティティを定義するには、クラスを実装し、Durable Task worker に登録します。
注
エンティティのサポートは、.NET、JavaScript/TypeScript、Python SDK で利用できます。 Java SDK は現在、エンティティをサポートしていません。
エンティティの定義、呼び出し、および管理に関する完全なガイドについては、「 Durable エンティティ」を参照してください。
Client
クライアント コンポーネントは、オーケストレーションの外部からオーケストレーションとエンティティを操作する方法です。 一般的なクライアント操作は次のとおりです。
- 新しいオーケストレーション インスタンスのスケジュール作成
- 実行中または終了したオーケストレーションの状態をクエリする
- 待機中のオーケストレーションへのイベントの通知
- オーケストレーション インスタンスの中断と再開
- オーケストレーション インスタンスの終了
- エンティティ操作のシグナリングおよびエンティティ状態の読み取り
オーケストレーター以外の関数は、クライアント関数として機能できます。 それがクライアントになるのは、 永続的なクライアント出力バインディングの使用です。 たとえば、HTTP によってトリガーされる関数、キューによってトリガーされる関数、タイマーによってトリガーされる関数からオーケストレーションを開始できます。
永続的なクライアント バインドには、エンティティ操作の通知やエンティティの状態の読み取りなど、 エンティティと対話するための API も用意されています。 詳細については、 エンティティ クライアント バインドを参照してください。
Durable Task SDK では、 クラスを介してオーケストレーションとエンティティを操作します。 アプリケーション コードでクライアント インスタンスを作成し、そのメソッドを呼び出して、オーケストレーションインスタンスとエンティティインスタンスを開始、クエリ、または管理します。 クライアントは、アプリケーションの任意の部分 (HTTP エンドポイント、バックグラウンド サービス、コンソール アプリ、またはその他のコード) から使用できます。
各言語のコード サンプルなど、すべてのインスタンス管理操作の詳細については、「 オーケストレーション インスタンスの管理」を参照してください。
次のステップ
最初の Durable Function アプリの作成を開始します。
永続的オーケストレーションについて詳しく知る
Durable Task SDK を始める:
- Durable Task SDK のクイック スタート
Durable Task SDK アプリを Azure Container Apps
永続的オーケストレーションについて詳しく知る