通过


你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

持久任务计划程序的大型有效负载支持(预览版)

通过大型有效负载支持,你的应用可以传递超过持久任务计划程序消息大小限制的业务流程输入和活动输出。 当有效负载超过配置的阈值时,框架会将序列化的有效负载存储在Azure Blob 存储中,并通过 Durable Task Scheduler 发送小型引用。

此功能适用于:

如果工作流将数据存储在Blob 存储中,并且仅传递 URI 或标识符,请继续使用该模式。 当业务流程逻辑必须在持久操作之间传递有效负载时,请使用大型有效负载支持。 有关一般指南,请参阅 Durable Functions0 中的数据持久性和序列化。

支持的框架

此表显示各框架对大规模有效负载的支持情况。

Framework 支持状态 所需内容
Durable Functions .NET隔离的C#中支持 将持久任务计划程序用作存储提供程序,并将 AzureWebJobsStorage 用于有效负载 Blob
持久任务软件开发工具包 在 .NET 和 Python 中受支持 将特定语言的 Azure Blob 有效负载扩展与 Azure Blob 存储一起使用
JavaScript、PowerShell 和Java 不可用 使用外部存储,并在持久化操作中传递引用

工作原理

启用大型有效负载支持时,运行时在两个托管模型中遵循相同的高级流:

  1. 它序列化编排输入或操作输出。
  2. 如果有效负载大小超过配置的阈值,运行时会使用 gzip 压缩有效负载。
  3. 它将压缩的有效负载写入Azure Blob 存储。
  4. 它通过持久任务计划程序而不是完整有效负载发送 Blob 引用。
  5. 运行时会在业务流程协调程序或活动代码读取值之前自动解析引用。

当前.NET示例使用确定性、低压缩性 1.5 MiB 有效负载。 这样,即使运行时使用 gzip 内容编码写入 blob,存储的 blob 大小也具有代表性。

大型有效负载支持改变了有效负载通过运行时传递的方式。 它不会改变保持持久状态尽可能小而实用的建议。

选择正确的模式

使用最简单的模式来匹配您的场景。

使用此模式 何时使用
大型有效负载支持 业务流程在持久操作之间传递有效负载,而有效负载超过了计划程序消息限制。
外部存储加上引用 你的活动直接从存储中加载数据,并且你希望业务流程状态尽可能小。

启用大型有效负载支持

Durable Functions中的大型有效负载支持仅适用于使用持久任务计划程序作为存储提供程序的.NET隔离 C# 应用。

启用该功能之前,请确保应用:

  • 使用 .NET 独立工作进程。
  • 引用 Microsoft.Azure.Functions.Worker.Extensions.DurableTaskMicrosoft.Azure.Functions.Worker.Extensions.DurableTask.AzureManaged
  • AzureWebJobsStorage 设置为保存外部化有效负载的存储帐户。
  • 设置 DTS_CONNECTION_STRINGTASKHUB_NAME 的目标调度器和任务中心。

然后在 host.json中启用大型有效负载存储:

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DTS_CONNECTION_STRING",
        "payloadStorageEnabled": true,
        "payloadStorageThresholdBytes": 900000
      },
      "hubName": "%TASKHUB_NAME%"
    }
  }
}

在持久任务计划程序消息大小边界下方设置 payloadStorageThresholdBytes ,使运行时在接近限制之前将有效负载外部化。

在业务流程协调程序和活动代码中使用标准Durable Functions API。 运行时会在 context.GetInput<T>() 之前自动解析 Blob 引用,然后 context.CallActivityAsync<T>() 返回数据。

默认情况下,扩展会将外部化有效负载写入由durabletask-payloads配置的存储帐户中的AzureWebJobsStorage容器。

有关端到端示例,请参阅以下示例:

Durable Task SDK 中的大型有效负载支持可用于.NET和Python应用。

安装 Azure Blob 有效负载扩展包:

dotnet add package Microsoft.DurableTask.Extensions.AzureBlobPayloads

为持久任务计划程序安装 Azure 托管客户端和辅助角色包:

dotnet add package Microsoft.DurableTask.Client.AzureManaged
dotnet add package Microsoft.DurableTask.Worker.AzureManaged

注册外部化有效负载存储,选择阈值,并在客户端和工作器上启用有效负载处理。

builder.Services.AddExternalizedPayloadStore(options =>
{
    options.ThresholdBytes = 900_000;
    options.ConnectionString = builder.Configuration["PAYLOAD_STORAGE_CONNECTION_STRING"]
        ?? "UseDevelopmentStorage=true";
    options.ContainerName = "durabletask-payloads";
});

builder.Services.AddDurableTaskClient(client =>
{
    client.UseDurableTaskScheduler(schedulerConnectionString);
    client.UseExternalizedPayloads();
});

builder.Services.AddDurableTaskWorker(worker =>
{
    worker.UseDurableTaskScheduler(schedulerConnectionString);
    worker.UseExternalizedPayloads();
});

如果使用Microsoft Entra ID而不是存储连接字符串,请设置 options.AccountUrioptions.Credential。 该示例使用 DefaultAzureCredential,并且可以有选择性地以用户分配的托管标识为目标。

保留 ThresholdBytes 不高于 1,048,576 字节。 该示例使用 900,000 字节,以便在负载接近 1 兆字节调度器消息界限之前卸载负载。

有关端到端.NET示例,请参阅 Durable Task SDK 大型有效负载示例

环境变量配置

将这些本地设置或应用设置与当前Durable Functions示例配合使用。

设置 说明 示例默认值
FUNCTIONS_WORKER_RUNTIME Azure Functions 独立工作线程运行时 dotnet-isolated
AzureWebJobsStorage Functions 主机状态和有效负载 Blob 的存储 UseDevelopmentStorage=true 本地
DTS_CONNECTION_STRING 持久任务计划程序连接字符串 Endpoint=http://localhost:8080;Authentication=None
TASKHUB_NAME 目标任务中心 default
PAYLOAD_SIZE_BYTES 启动器使用或每个活动生成的有效载荷大小 1572864
ACTIVITY_COUNT 仅扇出/扇入示例中的并行活动数 3

ACTIVITY_COUNT 设置仅由 LargePayloadFanOutFanIn 示例使用。 LargePayload 往返示例不会读取它。

将这些环境变量与当前的 Durable Task SDK 示例一起使用。

Variable 说明 示例默认值
DURABLE_TASK_SCHEDULER_CONNECTION_STRING 持久任务计划程序连接字符串 Endpoint=http://localhost:8080;TaskHub=default;Authentication=None
PAYLOAD_STORAGE_CONNECTION_STRING 外部化有效负载的 Blob 存储连接字符串 UseDevelopmentStorage=true
PAYLOAD_STORAGE_ACCOUNT_URI 用于基于标识的有效负载存储访问的 Blob 帐户 URI 取消设置
PAYLOAD_CONTAINER_NAME 用于外部存储负载的 Blob 容器 durabletask-payloads
PAYLOAD_SIZE_BYTES 运行终结点使用的默认有效负载大小 1572864
EXTERNALIZE_THRESHOLD_BYTES Blob 卸载阈值 900000
PAYLOAD_STORAGE_MANAGED_IDENTITY_CLIENT_ID 用于存储访问的用户分配的可选托管标识客户端 ID 取消设置
AZURE_CLIENT_ID 选择用户分配的托管标识的替代方法 取消设置
ASPNETCORE_URLS 示例 HTTP 主机的侦听 URL 框架默认值

如果 PAYLOAD_STORAGE_CONNECTION_STRING 没有设置且提供了 PAYLOAD_STORAGE_ACCOUNT_URI,则示例使用 DefaultAzureCredential。 如果需要特定的用户分配身份,请设置PAYLOAD_STORAGE_MANAGED_IDENTITY_CLIENT_IDAZURE_CLIENT_ID

Azure权限

使用 Azure 资源而不是本地模拟器时,应用程序标识需要访问 Durable Task Scheduler 以及 Blob 存储。

  • 在应用的任务中心上授予 Durable Task Data Contributor
  • 在存储有效负载 Blob 的存储帐户上授予 Storage Blob Data Contributor

这些权限适用于使用托管标识的 Durable Functions 应用程序与 Durable Task SDK 应用程序。

检查数据包卸载是否正常工作

在启用有效负载卸载后,运行输入或输出大于已配置阈值的业务流程。 然后检查这两个信号:

  • 即使有效负载超过 1 MiB,编排也成功完成。
  • Blob 条目显示在容器durabletask-payloads中。

对于本地开发,请运行此Azure CLI命令来检查容器:

az storage blob list \
  --connection-string "UseDevelopmentStorage=true" \
  --container-name durabletask-payloads \
  --output table

示例应用还会验证往返:

  • Durable Functions示例返回一个小摘要对象,用于确认输入和输出大小。
  • .NET Durable Task SDK 示例显示运行是否创建新的有效负载数据块。
  • Python Durable Task SDK 示例同时运行内联有效负载流和外部化有效负载流,并输出每个运行的业务流程结果。

由于运行时使用 gzip 内容编码存储外部化有效负载,因此 Azure 会报告压缩的磁盘 Blob 大小。 对于当前的低压缩性示例有效负载,这些 Blob 大小应与逻辑有效负载大小保持相当接近。

注释

清除业务流程实例目前不会从 Azure Blob 存储中删除对应的外部化有效负载 Blob。 如果需要删除这些有效负载,请分别从存储帐户中删除 Blob。

后续步骤