.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<SayHelloTyped> 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
。 有关详细信息,请参阅此文。