Azure 资源管理器 DurableTask .NET

azure-resource-manager-durabletask-dotnet
分类通用
作者Agentic Awesome Skills 社区
许可MIT
评分4.40/5
使用5.3K

Azure.ResourceManager.DurableTask (.NET)

用于通过 Azure 资源管理器(Azure Resource Manager)配置和管理 Azure Durable Task Scheduler 资源的管理平面 SDK。

> ⚠️ 管理平面 vs 数据平面
> - 本 SDK (Azure.ResourceManager.DurableTask):创建调度程序、任务中心,配置保留策略
> - 数据平面 SDK (Microsoft.DurableTask.Client.AzureManaged):启动编排、查询实例、发送事件

安装

bash
dotnet add package Azure.ResourceManager.DurableTask
dotnet add package Azure.Identity

当前版本:稳定版 v1.0.0 (2025-11-03),预览版 v1.0.0-beta.1 (2025-04-24)
API 版本:2025-11-01

环境变量

bash
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
AZURE_RESOURCE_GROUP=<your-resource-group>

用于服务主体身份验证(可选)

AZURE_TENANT_ID=<tenant-id> AZURE_CLIENT_ID=<client-id> AZURE_CLIENT_SECRET=<client-secret>

身份验证

csharp
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.DurableTask;

// 始终使用 DefaultAzureCredential
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);

// 获取订阅
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
new ResourceIdentifier($"/subscriptions/{subscriptionId}"));

资源层级

code
ArmClient
└── SubscriptionResource
    └── ResourceGroupResource
        └── DurableTaskSchedulerResource
            ├── DurableTaskHubResource
            └── DurableTaskRetentionPolicyResource

核心工作流

1. 创建 Durable Task Scheduler

csharp
using Azure.ResourceManager.DurableTask;
using Azure.ResourceManager.DurableTask.Models;

// 获取资源组
var resourceGroup = await subscription
.GetResourceGroupAsync("my-resource-group");

// 定义使用 Dedicated SKU 的调度程序
var schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)
{
Properties = new DurableTaskSchedulerProperties
{
Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)
{
Capacity = 1 // 实例数量
},
// 可选:用于网络安全的 IP 白名单
IPAllowlist = { "10.0.0.0/24", "192.168.1.0/24" }
}
};

// 创建调度程序(长时间运行的操作)
var schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();
var operation = await schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-scheduler",
schedulerData);

DurableTaskSchedulerResource scheduler = operation.Value;
Console.WriteLine($"Scheduler created: {scheduler.Data.Name}");
Console.WriteLine($"Endpoint: {scheduler.Data.Properties.Endpoint}");

2. 使用 Consumption SKU 创建调度程序

csharp
// Consumption SKU (无服务器)
var consumptionSchedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)
{
    Properties = new DurableTaskSchedulerProperties
    {
        Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Consumption)
        // Consumption 模式不需要指定容量
    }
};

var operation = await schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-serverless-scheduler",
consumptionSchedulerData);

3

. 创建任务中心 (Task Hub)
csharp
// 任务中心在调度程序 (scheduler) 下创建
var taskHubData = new DurableTaskHubData
{
    // 基础任务中心的属性为可选
};

var taskHubCollection = scheduler.GetDurableTaskHubs();
var hubOperation = await taskHubCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-taskhub",
taskHubData);

DurableTaskHubResource taskHub = hubOperation.Value;
Console.WriteLine($"Task Hub created: {taskHub.Data.Name}");

4. 列出调度程序

csharp
// 列出订阅中的所有调度程序
await foreach (var sched in subscription.GetDurableTaskSchedulersAsync())
{
    Console.WriteLine($"Scheduler: {sched.Data.Name}");
    Console.WriteLine($"  Location: {sched.Data.Location}");
    Console.WriteLine($"  SKU: {sched.Data.Properties.Sku?.Name}");
    Console.WriteLine($"  Endpoint: {sched.Data.Properties.Endpoint}");
}

// 列出资源组中的调度程序
var schedulers = resourceGroup.Value.GetDurableTaskSchedulers();
await foreach (var sched in schedulers.GetAllAsync())
{
Console.WriteLine($"Scheduler: {sched.Data.Name}");
}

5. 按名称获取调度程序

csharp
// 获取现有调度程序
var existingScheduler = await schedulerCollection.GetAsync("my-scheduler");
Console.WriteLine($"Found: {existingScheduler.Value.Data.Name}");

// 或使用扩展方法
var schedulerResource = armClient.GetDurableTaskSchedulerResource(
DurableTaskSchedulerResource.CreateResourceIdentifier(
subscriptionId,
"my-resource-group",
"my-scheduler"));
var scheduler = await schedulerResource.GetAsync();

6. 更新调度程序

csharp
// 获取当前调度程序
var scheduler = await schedulerCollection.GetAsync("my-scheduler");

// 使用新配置进行更新
var updateData = new DurableTaskSchedulerData(scheduler.Value.Data.Location)
{
Properties = new DurableTaskSchedulerProperties
{
Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)
{
Capacity = 2 // 扩容
},
IPAllowlist = { "10.0.0.0/16" } // 更新 IP 白名单
}
};

var updateOperation = await schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed,
"my-scheduler",
updateData);

7. 删除资源

csharp
// 先删除任务中心
var taskHub = await scheduler.GetDurableTaskHubs().GetAsync("my-taskhub");
await taskHub.Value.DeleteAsync(WaitUntil.Completed);

// 然后删除调度程序
await scheduler.DeleteAsync(WaitUntil.Completed);

8. 管理保留策略 (Retention Policies)

csharp
// 获取保留策略集合
var retentionPolicies = scheduler.GetDurableTaskRetentionPolicies();

// 创建或更新保留策略
var retentionData = new DurableTaskRetentionPolicyData
{
Properties = new DurableTaskRetentionPolicyProperties
{
// 配置保留设置
}
};

var retentionOperation = await retentionPolicies.CreateOrUpdateAsync(
WaitUntil.Completed,
"default", // 策略名称
retentionData);

关键类型参考

| 类型 | 用途 |
|------|---------|
| ArmClient | 所有 ARM 操作的入口点 |
| DurableTaskSchedulerResource | 表示一个 Durable Task 调度程序 |
| DurableTaskSchedulerCollection | 用于调度程序 CRUD 操作的集合 |
| DurableTaskSchedulerData | 调度程序创建/更新的负载数据 |
| DurableTaskSchedulerProperties | 调度程序配置(SKU, IPAllowlist) |
| DurableTaskSchedulerSku | SKU 配置(名称, 容量, 冗余) |
ndancyState) |
| DurableTaskSchedulerSkuName | SKU 选项:Dedicated(专用)、Consumption(消费) |
| DurableTaskHubResource | 表示任务中心 (Task Hub) |
| DurableTaskHubCollection | 任务中心 CRUD 集合 |
| DurableTaskHubData | 任务中心创建负载 |
| DurableTaskRetentionPolicyResource | 保留策略管理 |
| DurableTaskRetentionPolicyData | 保留策略配置 |
| DurableTaskExtensions | ARM 客户端的扩展方法 |

SKU 选项

| SKU | 描述 | 使用场景 |
|-----|-------------|----------|
| Dedicated | 固定容量,实例可配置 | 生产工作负载,性能可预测 |
| Consumption | Serverless,自动缩放 | 开发环境,波动的工作负载 |

扩展方法

SDK 为 SubscriptionResourceResourceGroupResource 提供了扩展方法:

csharp
// 在 SubscriptionResource 上
subscription.GetDurableTaskSchedulers();           // 列出订阅中的所有调度程序
subscription.GetDurableTaskSchedulersAsync();      // 异步可枚举

// 在 ResourceGroupResource 上
resourceGroup.GetDurableTaskSchedulers(); // 获取集合
resourceGroup.GetDurableTaskSchedulerAsync(name); // 按名称获取

// 在 ArmClient 上
armClient.GetDurableTaskSchedulerResource(id); // 按资源 ID 获取
armClient.GetDurableTaskHubResource(id); // 按 ID 获取任务中心

最佳实践

1. 对于必须在继续之前完成的操作,请使用 WaitUntil.Completed
2. 如果需要手动轮询或并行运行操作,请使用 WaitUntil.Started
3. 始终使用 DefaultAzureCredential —— 切勿硬编码密钥。
4. 使用 RequestFailedException 处理 ARM API 错误。
5. 对于幂等操作,请使用 CreateOrUpdateAsync
6. 先删除任务中心,再删除调度程序 —— 包含任务中心的调度程序无法直接删除。
7. 在生产环境中,使用 IP 允许列表 确保网络安全。

错误处理

csharp
using Azure;

try
{
var operation = await schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed, schedulerName, schedulerData);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
Console.WriteLine("调度程序已存在");
}
catch (RequestFailedException ex) when (ex.Status == 404)
{
Console.WriteLine("未找到资源组");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"ARM 错误: {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}

完整示例

csharp
using Azure;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.DurableTask;
using Azure.ResourceManager.DurableTask.Models;
using Azure.ResourceManager.Resources;

// 设置
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);

var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID")!;
var resourceGroupName = Environment.GetEnvironmentVariable("AZURE_RESOURCE_GROUP")!;

var subscription = armClient.GetSubscriptionResource(
new ResourceIdentifier($"/subscriptions/{subscriptionId}"));
var resourceGroup = await subscription.GetResourceGroupAsync(resourceGroupName);

// 创建调度程序
var schedulerData = new DurableTaskSchedulerData(AzureLocation.EastUS)
{
Properties = new DurableTaskSchedulerProperties
{
Sku = new DurableTaskSchedulerSku(DurableTaskSchedulerSkuName.Dedicated)
{
Capacity = 1
}
}
};

var schedulerCollection = resourceGroup.Value.GetDurableTaskSchedulers();
var schedulerOp = await


csharp
schedulerCollection.CreateOrUpdateAsync(
WaitUntil.Completed, "my-scheduler", schedulerData);
var scheduler = schedulerOp.Value;

Console.WriteLine($"Scheduler endpoint: {scheduler.Data.Properties.Endpoint}");

// 创建任务中心 (Task Hub)
var taskHubData = new DurableTaskHubData();
var taskHubOp = await scheduler.GetDurableTaskHubs().CreateOrUpdateAsync(
WaitUntil.Completed, "my-taskhub", taskHubData);
var taskHub = taskHubOp.Value;

Console.WriteLine($"Task Hub: {taskHub.Data.Name}");

// 清理
await taskHub.DeleteAsync(WaitUntil.Completed);
await scheduler.DeleteAsync(WaitUntil.Completed);

相关 SDK

| SDK | 用途 | 安装命令 |
|-----|---------|---------|
| Azure.ResourceManager.DurableTask | 管理平面 (本 SDK) | dotnet add package Azure.ResourceManager.DurableTask |
| Microsoft.DurableTask.Client.AzureManaged | 数据平面 (编排、活动) | dotnet add package Microsoft.DurableTask.Client.AzureManaged |
| Microsoft.DurableTask.Worker.AzureManaged | 用于运行编排的 Worker | dotnet add package Microsoft.DurableTask.Worker.AzureManaged |
| Azure.Identity | 身份验证 | dotnet add package Azure.Identity |
| Azure.ResourceManager | 基础 ARM SDK | dotnet add package Azure.ResourceManager |

源码参考

使用场景

本技能适用于执行概览中所描述的工作流或操作。

局限性

  • 仅在任务明确符合上述范围时使用此技能。
  • 不要将输出结果视为针对特定环境的验证、测试或专家评审的替代方案。
  • 如果缺少必要的输入、权限、安全边界或成功标准,请停止操作并寻求澄清。