本快速入门将介绍如何运行一个 .NET Durable Task SDK 示例,该示例使用工作项筛选功能来将任务流和活动路由到专用的工作角色。
如果没有工作项筛选,Durable Task Scheduler 将所有工作项传递到每个连接的辅助角色,而不管每个辅助角色实际实现什么。 这会导致多服务部署和滚动升级中出现错误或无提示挂起。 通过工作项筛选,每个工作者声明其托管的协调程序和操作,计划程序仅将工作项路由到匹配的工作者。
- 设置并运行 Durable Task Scheduler 模拟器进行本地开发。
- 运行 Orchestrator、验证器工作程序、传输器工作程序,以及客户端。
- 验证工作项是否仅路由到匹配的工作人员。
- 使用 Azure 开发人员 CLI 将示例部署到 Azure 容器应用。
先决条件
开始之前:
- 安装 .NET 10 SDK 或更高版本。
- 安装 Docker 以运行模拟器。
- 安装 Azure Developer CLI。
- 克隆 Durable Task Scheduler GitHub 存储库。
准备项目
从 Azure-Samples/Durable-Task-Scheduler 根目录导航到示例目录:
cd samples/scenarios/WorkItemFilteringSplitActivities
使用模拟器在本地运行
拉取模拟器映像:
docker pull mcr.microsoft.com/durable-task/emulator:latest运行模拟器:
docker run -d --name dts-emulator -p 8080:8080 -p 8082:8082 mcr.microsoft.com/durable-task/emulator:latest生成示例:
dotnet build在单独的终端中运行每个工作进程。
终端 1 - Orchestrator 工作单元
dotnet run --project src/OrchestratorWorker终端 2 - 验证器工作者
dotnet run --project src/ValidatorWorker终端 3 - 装运工
dotnet run --project src/ShipperWorker在第四个终端中,运行客户端:
dotnet run --project src/Client在
http://localhost:8082打开模拟仪表板以监控编排活动。
小窍门
作为手动打开四个终端的替代方法,可以运行包含的便利脚本:
./run-local.sh
它启动模拟器,生成解决方案,并启动所有辅助角色和客户端。
工作项筛选的预期输出
你应该会看到:
- 客户端编排批次计划并等待完成。
- Orchestrator 工作器分派
ValidateOrder和ShipOrder活动调用。 - 验证程序工作者仅处理
ValidateOrder活动工作项。 - 仅处理
ShipOrder活动工作项的发货工人。
此行为证实,工作项筛选仅将项目路由到登记了符合任务类型的工作人员。
试一试:严格路由实验
若要验证路由设定的严格性(没有备份或切换到其他工作程序):
- 停止发货人工人(终端 3 中的 Ctrl+C)。
- 再次运行客户端以调度新的编排。
- 请注意:
- Orchestrator 工作器拾取并启动编排任务。
- 验证器工作者为每个订单完成
ValidateOrder。 -
ShipOrder工作项保持 挂起 — 它们不会传递到验证程序或 Orchestrator 辅助角色。 - 编排流程保持“正在运行”状态,等待
ShipOrder完成。
- 重启运货商工作线程 — 挂起
ShipOrder的工作项会立即交付,业务流程完成。
这证明了工作项仅被指派给符合筛选条件的员工。 没有备用方案。
使用 Azure 开发人员 CLI 进行部署
使用Azure进行身份验证(如果尚未):
azd auth login从
samples/scenarios/WorkItemFilteringSplitActivities中运行:azd up在终端中出现提示时,请提供以下参数:
参数 Description 环境名称 为保存所有 Azure 资源而创建的资源组的前缀。 Azure 位置 您资源的 Azure 位置。 Azure订阅 用于您的资源的 Azure 订阅。
该 azd up 命令预配 Azure 资源,并从此示例部署四个容器化服务:客户端、业务流程协调程序辅助角色、验证程序辅助角色和发货人。
确认部署是否成功
在
azd up的输出中,复制资源组名称。在 Azure 门户中,打开该资源组。
对于每个已部署的容器应用(
client、、orchestrator-worker、validator-workershipper-worker),打开监视>日志流。验证每个应用仅记录其预期工作项:
-
orchestrator-worker:编排工作。 -
validator-worker:ValidateOrder活动。 -
shipper-worker:ShipOrder活动。
-
Note
每个容器应用都配置了 KEDA 缩放规则(azure-durabletask-scheduler),该规则根据挂起工作项的积压工作自动将工作器从 0 缩放到 10 个副本。 当客户端完成其循环并且没有工作项保留时,工作线程会减少到零个。 有关详细信息,请参阅 Azure 容器应用 中的 Durable Task Scheduler 自动缩放。
了解工作项筛选代码
编排按顺序调用两个活动。 计划程序将每个活动工作项路由到注册它的工作者。
public override async Task<string> RunAsync(TaskOrchestrationContext context, string orderId)
{
string validationResult = await context.CallActivityAsync<string>("ValidateOrder", orderId);
string shippingResult = await context.CallActivityAsync<string>("ShipOrder", orderId);
return $"Order '{orderId}' => Validation: [{validationResult}], Shipping: [{shippingResult}]";
}
每个工作进程仅注册其本地任务并调用 UseWorkItemFilters() 以选择参与筛选。 然后,SDK 从任务注册表生成工作项筛选器。
builder.Services.AddDurableTaskWorker()
.AddTasks(registry =>
{
registry.AddAllGeneratedTasks();
})
.UseWorkItemFilters()
.UseDurableTaskScheduler(connectionString);
Note
从 .NET Durable Task SDK 版本 1.23.0 开始,默认情况下不再启用工作项筛选器。 必须显式调用 UseWorkItemFilters() 在每个工作线程上才能启用筛选。 未调用它的工作者会像以前一样接收所有工作项类型。
例如:
-
OrchestratorWorker寄存器OrderProcessingOrchestration. -
ValidatorWorker寄存器ValidateOrder. -
ShipperWorker寄存器ShipOrder.
当工作线程连接到 Durable Task Scheduler 时,SDK 会发送其筛选器列表。 计划程序为每个过滤器创建队列,并将每个工作项路由到匹配的队列。 工作人员永远不会收到他们未注册的工作项类型。
清理资源
停止本地模拟器容器:
docker rm -f dts-emulator如果部署到Azure,请标识资源组名称:
- 把它从
azd up输出中复制。 - 或在 Azure 门户中,使用顶部的全局搜索框,搜索
rg-或环境名称前缀。
- 把它从
从搜索结果中打开资源组。
选择 “删除资源组”,输入要确认的资源组名称,然后选择“ 删除”。