.NET 分離ワーカーの Durable Functions の概要

この記事は、.NET 分離ワーカーの Durable Functions の概要です。 分離ワーカーを使用すると、Durable Functions アプリを、Azure Functions ホストとは異なる .NET バージョンで実行できます。

.NET 分離ワーカーの Durable Functions を使用する理由

このモデルを使用すると、Azure Functions .NET 分離ワーカー プロセスに付随するすべての優れた利点を得ることができます。 詳細については、「分離ワーカー モデルの利点」を参照してください。 さらに、この新しい SDK には、いくつかの新しい機能が含まれています。

インプロセス Durable Functions に対する機能の改善

  • オーケストレーション入力を次のように直接挿入できます。MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, T input)
  • 厳密に型指定された呼び出しとクラスベースのアクティビティとオーケストレーションのサポート (注: プレビュー段階です。詳細については、こちらを参照してください)。
  • 加えて、Azure Functions .NET 分離ワーカーのすべての利点。

ソース ジェネレーターとクラスベースのアクティビティとオーケストレーション

要件: プロジェクトに <PackageReference Include="Microsoft.DurableTask.Generators" Version="1.0.0-preview.1" /> を追加します。

ソース ジェネレーター パッケージを追加すると、次の 2 つの新機能にアクセスできます。

  • クラスベースのアクティビティとオーケストレーション。Durable Functions を記述する別の方法です。 "関数ベース" の代わりに、Durable SDK から型を継承する厳密に型指定されたクラスを記述します。
  • 厳密に型指定された拡張メソッド。サブ オーケストレーションとアクティビティを呼び出します。 これらの拡張メソッドは、"関数ベースの" アクティビティとオーケストレーションからも使用できます。

関数ベースの例

public static class MyFunctions
{
    [Function(nameof(MyActivity))] 
    public static async Task<string> MyActivity([ActivityTrigger] string input)
    {
        // implementation
    }

    [Function(nameof(MyOrchestration))] 
    public static async Task<string> MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, string input)
    {
        // implementation
        return await context.CallActivityAsync(nameof(MyActivity), input);
    }
}

クラスベースの例

[DurableTask(nameof(MyActivity))]
public class MyActivity : TaskActivity<string, string>
{
    private readonly ILogger logger;

    public MyActivity(ILogger<MyActivity> logger) // activites have access to DI.
    {
        this.logger = logger;
    }

    public async override Task<string> RunAsync(TaskActivityContext context, string input)
    {
        // implementation
    }
}

[DurableTask(nameof(MyOrchestration))]
public class MyOrchestration : TaskOrchestrator<string, string>
{
    public async override Task<string> RunAsync(TaskOrchestrationContext context, string input)
    {
        ILogger logger = context.CreateReplaySafeLogger<MyOrchestration>(); // orchestrations do NOT have access to DI.

        // An extension method was generated for directly invoking "MyActivity".
        return await context.CallMyActivityAsync(input);
    }
}

持続エンティティ

持続エンティティは、.NET Isolated worker でサポートされています。 開発者ガイドを参照してください。

移行ガイド

このガイドでは、.NET Durable Functions 2.x プロジェクトから着手することを想定しています。

プロジェクトを更新する

最初の手順は、Azure Functions .NET 分離にプロジェクトを更新することです。 次に、Durable Functions NuGet パッケージ参照を更新します。

旧:

<ItemGroup>
  <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.9.0" />
</ItemGroup>

新規:

<ItemGroup>
  <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.DurableTask" Version="1.1.0" />
</ItemGroup>

コードを更新する

.NET 分離ワーカーの Durable Functions は、型と名前空間が異なるまったく新しいパッケージです。 結果としてコードに必要な変更がありますが、多くの API は変更を必要せずに適合します。

Host.json スキーマ

Durable Functions .NET 分離ワーカーと Durable Functions 2.x のスキーマは同じままで、変更は必要ありません。

パブリック API の変更

この表は、変更の全一覧ではありません。

2.x Isolated
IDurableOrchestrationClient DurableTaskClient
IDurableOrchestrationClient.StartNewAsync DurableTaskClient.ScheduleNewOrchestrationInstanceAsync
IDurableEntityClient.SignalEntityAsync DurableTaskClient.Entities.SignalEntityAsync
IDurableEntityClient.ReadEntityStateAsync DurableTaskClient.Entities.GetEntityAsync
IDurableEntityClient.ListEntitiesAsync DurableTaskClient.Entities.GetAllEntitiesAsync
IDurableEntityClient.CleanEntityStorageAsync DurableTaskClient.Entities.CleanEntityStorageAsync
IDurableOrchestrationContext TaskOrchestrationContext
IDurableOrchestrationContext.GetInput<T>() TaskOrchestrationContext.GetInput<T>() または、パラメーターとして次のように入力を挿入します。MyOrchestration([OrchestrationTrigger] TaskOrchestrationContext context, T input)
DurableActivityContext 同等の機能がありません
DurableActivityContext.GetInput<T>() パラメーターとして次のように入力を挿入します。MyActivity([ActivityTrigger] T input)
IDurableOrchestrationContext.CallActivityWithRetryAsync TaskOrchestrationContext.CallActivityAsync。再試行の詳細を含む TaskOptions パラメーターを含めます。
IDurableOrchestrationContext.CallSubOrchestratorWithRetryAsync TaskOrchestrationContext.CallSubOrchestratorAsync。再試行の詳細を含む TaskOptions パラメーターを含めます。
IDurableOrchestrationContext.CallHttpAsync TaskOrchestrationContext.CallHttpAsync
IDurableOrchestrationContext.CreateReplaySafeLogger(ILogger) TaskOrchestrationContext.CreateReplaySafeLogger<T>() または TaskOrchestrationContext.CreateReplaySafeLogger(string)
IDurableOrchestrationContext.CallEntityAsync TaskOrchestrationContext.Entities.CallEntityAsync
IDurableOrchestrationContext.SignalEntity TaskOrchestrationContext.Entities.SignalEntityAsync
IDurableOrchestrationContext.LockAsync TaskOrchestrationContext.Entities.LockEntitiesAsync
IDurableOrchestrationContext.IsLocked TaskOrchestrationContext.Entities.InCriticalSection
IDurableEntityContext TaskEntityContext.
IDurableEntityContext.EntityName TaskEntityContext.Id.Name
IDurableEntityContext.EntityKey TaskEntityContext.Id.Key
IDurableEntityContext.OperationName TaskEntityOperation.Name
IDurableEntityContext.FunctionBindingContext 削除されました。入力パラメーターとして FunctionContext を追加
IDurableEntityContext.HasState TaskEntityOperation.State.HasState
IDurableEntityContext.BatchSize 削除済み
IDurableEntityContext.BatchPosition 削除済み
IDurableEntityContext.GetState TaskEntityOperation.State.GetState
IDurableEntityContext.SetState TaskEntityOperation.State.SetState
IDurableEntityContext.DeleteState TaskEntityOperation.State.SetState(null)
IDurableEntityContext.GetInput TaskEntityOperation.GetInput
IDurableEntityContext.Return 削除されます。 代わりに使用されるメソッドの戻り値。
IDurableEntityContext.SignalEntity TaskEntityContext.SignalEntity
IDurableEntityContext.StartNewOrchestration TaskEntityContext.ScheduleNewOrchestration
IDurableEntityContext.DispatchAsync TaskEntityDispatcher.DispatchAsync. コンストラクターのパラメータが削除されました。

動作の変更

  • シリアル化の既定の動作が から Newtonsoft.JsonSystem.Text.Json変更されました。 詳細については、このページを参照してください。