.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" /> 新增至專案。

藉由新增來源產生器套件,您可以存取兩項新功能:

  • 類別型活動和協調流程,這是撰寫 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 隔離式背景工作角色支援持久性實體。 請參閱開發人員指南

移轉指南

本指南假設您從 .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 隔離式方案
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 參數與 retry 詳細資料。
IDurableOrchestrationContext.CallSubOrchestratorWithRetryAsync TaskOrchestrationContext.CallSubOrchestratorAsync,包含 TaskOptions 參數與 retry 詳細資料。
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.Json 變更為 System.Text.Json。 如需詳細資訊,請參閱此處