大きなペイロードのサポートにより、アプリは 、Durable Task Scheduler の メッセージ サイズの制限を超えるオーケストレーション入力とアクティビティ出力を渡すことができます。 ペイロードが構成されたしきい値を超えると、フレームワークはシリアル化されたペイロードをAzure Blob Storageに格納し、Durable Task Scheduler を介して小さな参照を送信します。
この機能は次で利用できます。
- Durable Functions と .NET アイソレーテッド ワーカー
- .NET Durable Task SDK
- Python Durable Task SDK
- Go Durable Task SDK(ベータ版)
ワークフローがBlob Storageにデータを格納し、URI または識別子のみを渡す場合は、そのパターンを使用し続けます。 オーケストレーション ロジックが永続的な操作間でペイロードを渡す必要がある場合は、大きなペイロードサポートを使用します。 一般的なガイダンスについては、
サポートされているフレームワーク
次の表は、フレームワークによる大規模なペイロードのサポートを示しています。
| フレームワーク | サポートの状態 | 必要なもの |
|---|---|---|
| Durable Functions | .NET アイソレートされた C# でサポートされます | ストレージ プロバイダーとして Durable Task Scheduler を使用し、ペイロード BLOB に AzureWebJobsStorage を使用する |
| Durable Task SDK | .NET、Python、Go(ベータ版)でサポートされています | Azure Blob Storageで言語固有のAzure Blobペイロードサポートを活用してください |
| JavaScript、PowerShell、Java | 該当なし | 外部ストレージを活用して耐久性のある操作間で参照を渡す |
どのように機能するのか
大規模なペイロードのサポートを有効にすると、ランタイムは両方のホスティング モデルで同じ高レベルのフローに従います。
- オーケストレーションの入力またはアクティビティの出力をシリアル化します。
- ペイロード サイズが構成されたしきい値を超えた場合、ランタイムは gzip を使用してペイロードを圧縮します。
- 圧縮されたペイロードをAzure Blob Storageに書き込みます。
- 完全なペイロードの代わりに、Durable Task Scheduler を通じて Blob リファレンスを送信します。
- ランタイムは、オーケストレーターまたはアクティビティ コードが値を読み取る前に、参照を自動的に解決します。
現在の.NETサンプルでは、確定的で圧縮率の低い 1.5 MiB ペイロードが使用されています。 これは、ランタイムが gzip コンテンツ エンコードを使用して BLOB を書き込む場合でも、格納された BLOB サイズの代表を保持します。
大きなペイロードのサポートによって、ペイロードがランタイム内を移動する方法が変わります。 耐久性のある状態を可能な限り小さく保つという推奨事項に変更はありません。
適切なパターンを選択する
シナリオに最も単純なパターンを使用します。
| このパターンを使用する | いつ使用するか |
|---|---|
| 大きなペイロードのサポート | オーケストレーションが永続的な操作間でペイロードを渡しており、そのペイロードがスケジューラ メッセージの制限を超えています |
| 外部ストレージと参照 | アクティビティはストレージから直接データを読み込み、可能な限り最小のオーケストレーション状態が必要です |
大きなペイロードのサポートを有効にする
Durable Functionsでの大規模なペイロードのサポートは、ストレージ プロバイダーとして Durable Task Scheduler を使用.NET分離された C# アプリでのみ使用できます。
この機能を有効にする前に、アプリが以下の条件を満たしていることを確認してください。
- .NET分離ワーカーを使用します。
-
Microsoft.Azure.Functions.Worker.Extensions.DurableTaskおよびMicrosoft.Azure.Functions.Worker.Extensions.DurableTask.AzureManagedを参照します。 - 外部化されたペイロードを保持するストレージ アカウントに
AzureWebJobsStorageを設定します。 - ターゲット スケジューラとタスク ハブの
DTS_CONNECTION_STRINGとTASKHUB_NAMEを設定します。
次に、host.jsonで大きなペイロード ストレージ を 有効にします。
{
"version": "2.0",
"extensions": {
"durableTask": {
"storageProvider": {
"type": "azureManaged",
"connectionStringName": "DTS_CONNECTION_STRING",
"payloadStorageEnabled": true,
"payloadStorageThresholdBytes": 262144
},
"hubName": "%TASKHUB_NAME%"
}
}
}
制限に近づく前にランタイムがペイロードを外部化するように、 payloadStorageThresholdBytes Durable Task Scheduler のメッセージ サイズ境界の下に設定します。
オーケストレーターとアクティビティ コードで標準のDurable Functions API を使用します。 ランタイムは、context.GetInput<T>() および context.CallActivityAsync<T>() にデータを返す前に BLOB 参照を自動的に解決します。
既定では、拡張機能は、durabletask-payloadsによって構成されたストレージ アカウント内のAzureWebJobsStorage コンテナーに外部化されたペイロードを書き込みます。
エンド ツー エンドの例については、次のサンプルを参照してください。
Durable Task SDKは、.NET、Python、Go(ベータ版)アプリの大規模なペイロードをサポートします。
Goアプリで大規模なペイロードサポートを有効にするには、コード内で設定してください:
-
payload.NewAzureBlobStoreを呼び出してAzure Blobのペイロードストアを作成します。 -
durabletaskscheduler.OptionsでLargePayloadsをapi.LargePayloadOptionsの値に設定してください。StoreフィールドとResolverフィールドの両方をペイロードストアに設定します。 - 同じ選択肢を
durabletaskscheduler.NewClientとdurabletaskscheduler.NewWorkerの両方に渡してください。 クライアントとワーカーはペイロードブロブを読み書きします。
Azuriteストレージエミュレーターでローカルで実行できる完全なGoの例については、 Go SDKの大規模ペイロードサンプルをご覧ください。
以下のタブは、.NETおよびPythonの大規模ペイロードサポートを有効にする方法を示しています。
Azure BLOB ペイロード拡張機能パッケージをインストールします。
dotnet add package Microsoft.DurableTask.Extensions.AzureBlobPayloads
Durable Task Scheduler 用の Azure Managed クライアント パッケージと worker パッケージをインストールします。
dotnet add package Microsoft.DurableTask.Client.AzureManaged
dotnet add package Microsoft.DurableTask.Worker.AzureManaged
外部化されたペイロード ストアを登録し、しきい値を選択し、クライアントと worker の両方でペイロード解決を有効にします。
builder.Services.AddExternalizedPayloadStore(options =>
{
options.ThresholdBytes = 262_144;
options.ConnectionString = builder.Configuration["PAYLOAD_STORAGE_CONNECTION_STRING"]
?? "UseDevelopmentStorage=true";
options.ContainerName = "durabletask-payloads";
});
builder.Services.AddDurableTaskClient(client =>
{
client.UseDurableTaskScheduler(schedulerConnectionString);
client.UseExternalizedPayloads();
});
builder.Services.AddDurableTaskWorker(worker =>
{
worker.UseDurableTaskScheduler(schedulerConnectionString);
worker.UseExternalizedPayloads();
});
ストレージ接続文字列の代わりにMicrosoft Entra IDを使用する場合は、options.AccountUri と options.Credential を設定します。 このサンプルでは、 DefaultAzureCredential を使用し、必要に応じてユーザー割り当てマネージド ID をターゲットにすることができます。
ThresholdBytesは1,048,576バイト以下にしてください。 このサンプルでは、SDK の既定値でもある 262,144 バイト (256 KiB) を使用するため、ペイロードは 1 MiB スケジューラ メッセージ境界に近づく前にオフロードされます。
エンドツーエンドの.NETの例については、Durable Task SDK の大規模なペイロード サンプルを参照してください。
環境変数の構成
これらのローカル設定またはアプリ設定は、現在のDurable Functionsサンプルと共に使用します。
| Setting | 説明 | サンプルの既定値 |
|---|---|---|
FUNCTIONS_WORKER_RUNTIME |
Azure Functions 分離ワーカー ランタイム | dotnet-isolated |
AzureWebJobsStorage |
Functions のホスト状態およびペイロード BLOB 用のストレージ |
UseDevelopmentStorage=true ローカルで |
DTS_CONNECTION_STRING |
Durable Task Scheduler 接続文字列 | Endpoint=http://localhost:8080;Authentication=None |
TASKHUB_NAME |
ターゲット タスク ハブ | default |
PAYLOAD_SIZE_BYTES |
スターターによって使用される、または各アクティビティによって生成されるペイロードのサイズ | 1572864 |
ACTIVITY_COUNT |
ファンアウト/ファンイン サンプルにおける並列アクティビティの数のみ | 3 |
ACTIVITY_COUNT設定は、LargePayloadFanOutFanInサンプルでのみ使用されます。
LargePayload ラウンドトリップ サンプルでは、読み取ることができません。
これらの環境変数を現在の.NETおよびPython Durable Task SDKサンプルで活用してください。
| Variable | 説明 | サンプルの既定値 |
|---|---|---|
DURABLE_TASK_SCHEDULER_CONNECTION_STRING |
Durable Task Scheduler 接続文字列 | Endpoint=http://localhost:8080;TaskHub=default;Authentication=None |
PAYLOAD_STORAGE_CONNECTION_STRING |
外部化されたペイロード用のBlob Storage接続文字列 | UseDevelopmentStorage=true |
PAYLOAD_STORAGE_ACCOUNT_URI |
アイデンティティベースのペイロードストレージアクセス用BLOBアカウントURI | 設定解除する |
PAYLOAD_CONTAINER_NAME |
外部化ペイロード用BLOBコンテナー | durabletask-payloads |
PAYLOAD_SIZE_BYTES |
実行エンドポイントで使用される既定のペイロード サイズ | 1572864 |
THRESHOLD_BYTES |
BLOB オフロードのしきい値 | 262144 |
PAYLOAD_STORAGE_MANAGED_IDENTITY_CLIENT_ID |
ストレージ アクセス用のオプションでユーザーが割り当てたマネージド アイデンティティ クライアント ID | 設定解除する |
AZURE_CLIENT_ID |
ユーザー割り当てマネージド ID を選択する別の方法 | 設定解除する |
ASPNETCORE_URLS |
サンプルの HTTP ホスト用のリッスン URL | フレームワークの既定値 |
PAYLOAD_STORAGE_CONNECTION_STRINGが設定されておらず、PAYLOAD_STORAGE_ACCOUNT_URIが指定されている場合、サンプルではDefaultAzureCredentialを使用します。 特定のユーザー割り当て ID が必要な場合は、 PAYLOAD_STORAGE_MANAGED_IDENTITY_CLIENT_ID または AZURE_CLIENT_IDを設定します。
Azureアクセス許可
ローカル エミュレーターの代わりに Azure リソースを使用する場合、アプリ ID は Durable Task Scheduler と Blob Storage にアクセスする必要があります。
- アプリのタスク ハブに
Durable Task Data Contributorを付与します。 - ペイロード BLOB を格納するストレージ アカウントに
Storage Blob Data Contributorを付与します。
これらのアクセス許可は、マネージド ID を使用する Durable Functions アプリと Durable Task SDK アプリに適用されます。
ペイロード オフロードが機能することを確認する
ペイロード オフロードを有効にした後、構成されたしきい値より大きい入力または出力でオーケストレーションを実行します。 次に、両方のシグナルを確認します。
- ペイロードが 1 MiB を超えても、オーケストレーションは正常に完了します。
- BLOB エントリは、
durabletask-payloadsコンテナーに表示されます。
ローカル開発の場合は、次のAzure CLI コマンドを実行してコンテナーを検査します。
az storage blob list \
--connection-string "UseDevelopmentStorage=true" \
--container-name durabletask-payloads \
--output table
サンプル アプリでは、ラウンド トリップも検証されます。
- Durable Functionsサンプルは、入力サイズと出力サイズを確認する小さなサマリー オブジェクトを返します。
- .NET Durable Task SDK サンプルでは、実行によって新しいペイロード BLOB が作成されるかどうかを出力します。
- Python Durable Task SDK サンプルは、インラインおよび外部化されたペイロード フローの両方を実行し、実行ごとにオーケストレーションの結果を出力します。
ランタイムは gzip コンテンツ エンコードを使用して外部化されたペイロードを格納するため、Azureは圧縮されたディスク上の BLOB サイズを報告します。 現在の圧縮率の低いサンプル ペイロードでは、これらの BLOB サイズは論理的なペイロード サイズに適度に近いままにする必要があります。
注
オーケストレーション インスタンスを削除しても、現在、対応する外部化されたペイロード BLOB はAzure Blob Storageから削除されません。 これらのペイロードを削除する必要がある場合は、ストレージ アカウントから BLOB を個別に削除します。