你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

.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 参数。
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.Json 更改为 System.Text.Json。 有关详细信息,请参阅此文