快速入门:在 Azure Kubernetes 服务 上托管 .NET Durable Task SDK 应用

在本快速入门中,你将现有的 .NET Durable Task SDK 示例部署到 Azure Kubernetes 服务 (AKS),并将 Durable Task 计划程序作为业务流程后端。 部署使用 Azure Developer CLI(azddocument 处理示例

你将学会如何:

  • 在本地设置并运行 Durable Task Scheduler 模拟器。
  • 在 AKS 场景示例中运行 .NET 客户端和工作器项目。
  • 使用 azd up.. 将示例基础结构和应用部署到 AKS。
  • 通过查看 Pod 日志来验证 AKS 中的编排执行。

先决条件

开始之前:

在本地准备并运行 Durable Task 示例

  1. 从存储库根目录转到 AKS 方案示例:

    cd samples/scenarios/DocumentProcessingOnAKS
    
  2. 启动 Durable Task Scheduler 模拟器:

    docker run --name dts-emulator -d -p 8080:8080 -p 8082:8082 mcr.microsoft.com/dts/dts-emulator:latest
    

    模拟器公开:

    • 8080 用于 gRPC 应用连接。
    • 8082 用于调度器仪表板。
  3. 生成解决方案:

    dotnet build DurableTaskOnAKS.sln
    
  4. 在一个终端中,运行辅助角色:

    cd Worker
    dotnet run
    
  5. 在第二个终端中,运行客户端:

    cd Client
    dotnet run
    
  6. 在客户端终端中确认类似于以下内容的输出:

    Endpoint: http://localhost:8080 | TaskHub: default
    Submitting 3 documents...
    
      Scheduled [...] 'Cloud Migration Strategy'
      -> Processed 'Cloud Migration Strategy': Sentiment=Positive, Topic=Technology, Priority=Normal
    
      Scheduled [...] 'Quarterly Incident Report'
      -> Processed 'Quarterly Incident Report': Sentiment=Positive, Topic=Technology, Priority=Normal
    
      Scheduled [...] 'ML Model Evaluation'
      -> Processed 'ML Model Evaluation': Sentiment=Positive, Topic=Technology, Priority=Normal
    
    Done.
    
  7. (可选)在 Durable Task Scheduler 仪表板上查看编排详情http://localhost:8082。 单击 默认 任务中心,然后单击业务流程实例 ID 以查看执行历史记录。

    持久任务计划程序仪表板的屏幕截图,其中显示了协调实例执行详细信息。

使用 Azure 开发人员 CLI 部署到 AKS

azd up预配并部署以下Azure资源:

资源 Purpose
AKS 群集 托管客户端(1 个副本)和工作节点(2 个副本)Pod。
Azure 容器注册表 (ACR) 存储通过 ACR 任务构建的 Docker 映像。
持久化任务调度程序(消费 SKU) 托管编排后端,用于状态和执行管理。
VNet AKS 的网络隔离。
用户定义的托管标识 + 联合凭据 从 Pod 到持久化任务调度器的工作负载身份认证。
  1. samples/scenarios/DocumentProcessingOnAKS中运行:

    azd up
    
  2. 出现提示时,请提供:

    参数 Description
    环境名称 用于部署资源的前缀。
    Azure订阅 用于部署的 Azure 订阅。
    Azure 位置 资源的 Azure 区域。

    预配大约需要 5-10 分钟。

使用 kubectl 验证 AKS 部署

  1. azd 环境中获取资源组和群集名称:

    azd env get-values | grep -E "RESOURCE_GROUP|AKS_NAME"
    
  2. 获取 AKS 凭据:

    az aks get-credentials --resource-group <resource-group-name> --name <aks-cluster-name>
    
  3. 确认 Pod 正在运行:

    kubectl get pods
    
  4. 检查客户端日志:

    kubectl logs -l app=client --tail=30
    
  5. 检查工作者日志:

    kubectl logs -l app=worker --tail=30
    

部署正常工作时,客户端日志会显示计划的业务流程和已完成的文档处理结果。

使用 Durable Task Scheduler 仪表板进行验证

还可以使用 Azure 门户中的 耐用任务调度程序仪表板验证编排状态。

  1. 打开 Azure 门户并导航到 Durable Task Scheduler 资源。
  2. 选择任务中心,然后选择 “打开仪表板”。
  3. 查找编排实例,然后单击实例 ID 以查看执行详细信息,包括并行分类活动。

了解代码

此示例使用两种 Durable Task 模式实现文档处理管道:

  1. 活动链接 - ValidateDocument 必须在分类开始之前通过。
  2. 扇出/扇入 - 三 ClassifyDocument 个活动并行运行(情绪、主题、优先级),业务流程在组装最终结果之前等待所有三个活动。
Client ──▶ DocumentProcessingOrchestration
               │
               ├─ 1. ValidateDocument            (activity chaining)
               │
               ├─ 2. ClassifyDocument × 3         (fan-out / fan-in)
               │      ├─ Sentiment
               │      ├─ Topic
               │      └─ Priority
               │
               └─ 3. Assemble result string ──▶ return to Client

客户端应用

客户端创建 Durable Task 客户端、安排编排流程并等待其完成。

foreach (var doc in docs)
{
    string id = await client.ScheduleNewOrchestrationInstanceAsync(
        "DocumentProcessingOrchestration", doc);

    var meta = await client.WaitForInstanceCompletionAsync(id, getInputsAndOutputs: true);
    if (meta.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
        Console.WriteLine($"  -> {meta.ReadOutputAs<string>()}\n");
}

此示例从环境变量(ENDPOINTTASKHUBAZURE_CLIENT_ID)生成连接字符串,当这些变量未设置时,使用本地模拟器的默认值。

工人应用

工作者注册编排和活动,然后连接到 Durable Task Scheduler。

builder.Services.AddDurableTaskWorker()
    .AddTasks(r =>
    {
        r.AddOrchestrator<DocumentProcessingOrchestration>();
        r.AddActivity<ValidateDocument>();
        r.AddActivity<ClassifyDocument>();
    })
    .UseDurableTaskScheduler(connectionString);

业务流程流

DocumentProcessingOrchestration 演示了活动链接及扇出/扇入:

bool isValid = await context.CallActivityAsync<bool>(nameof(ValidateDocument), doc);

var tasks = new[]
{
    context.CallActivityAsync<ClassificationResult>(nameof(ClassifyDocument), new ClassifyRequest(doc.Id, doc.Content, "Sentiment")),
    context.CallActivityAsync<ClassificationResult>(nameof(ClassifyDocument), new ClassifyRequest(doc.Id, doc.Content, "Topic")),
    context.CallActivityAsync<ClassificationResult>(nameof(ClassifyDocument), new ClassifyRequest(doc.Id, doc.Content, "Priority")),
};

ClassificationResult[] results = await Task.WhenAll(tasks);

清理资源

若要避免产生费用,请删除已部署Azure资源:

azd down

若要停止并删除本地模拟器,请执行以下作:

docker stop dts-emulator
docker rm dts-emulator

后续步骤