本文概述了 .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) // activities 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 独立工作器支持持久实体。 有关详细信息,请参阅 开发人员指南。
迁移指南
此过程假设你从一个与 Functions 主机同进程运行的 .NET Durable Functions 2.x 项目开始。
迁移你的项目
第一步是 将 .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 。 构造函数参数已移除。 |
IDurableOrchestrationClient.GetStatusAsync |
DurableTaskClient.GetInstanceAsync |
行为变更
- 序列化默认行为已从
Newtonsoft.Json
更改为System.Text.Json
。 有关详细信息,请参阅此文。