Durable Functions 存储提供程序

Durable Functions 是由持久任务框架 (DTFx) 在内部提供支持的一组 Azure Functions 触发器和绑定。 DTFx 支持各种后端存储提供程序,包括 Durable Functions 使用的 Azure 存储提供程序。 从 Durable Functions v2.5.0 开始,用户可以将其函数应用配置为使用 DTFx 存储提供程序而不是 Azure 存储提供程序。

注意

对于许多函数应用,Durable Functions 的默认 Azure 存储提供程序可能已足够,并且最容易使用,因为它不需要额外的配置。 但是,出于成本、可伸缩性和数据管理的权衡,有可能倾向于使用备用存储提供程序。

我们开发了两个备用存储提供程序,以便与 Durable Functions 和 Durable Task Framework 配合使用,即 Netherite 存储提供程序和 Microsoft SQL Server (MSSQL) 存储提供程序。 本文介绍了这三个支持的提供程序,将它们相互比较,并提供了有关如何开始使用它们的基本信息。

注意

目前无法将数据从一个存储提供程序迁移到另一个存储提供程序。 如果要使用新的存储提供程序,应创建一个使用新存储提供程序配置的新应用。

Azure 存储

Azure 存储是 Durable Functions 的默认存储提供程序。 它使用队列、表和 Blob 来持久保存业务流程和实体状态。 它还使用 Blob 和 Blob 租约来管理分区。 在许多情况下,用于存储 Durable Functions 运行时状态的存储帐户与 Azure Functions (AzureWebJobsStorage) 使用的默认存储帐户相同。 但是,也可以使用单独的存储帐户配置 Durable Functions。 Azure 存储提供程序内置于 Durable Functions 扩展中,并且没有任何其他依赖项。

Azure 存储提供程序的主要优势包括:

  • 无需设置 - 可以使用通过函数应用设置体验创建的存储帐户。
  • 成本最低的无服务器计费模型 - Azure 存储具有完全基于使用量的定价模型(详细信息)。
  • 最佳工具支持 - Azure 存储提供跨平台的本地仿真,并与 Visual Studio、Visual Studio Code 和 Azure Functions Core Tools 集成。
  • 最成熟 - Azure 存储是初始的适用于 Durable Functions 且经过最严格测试的存储后端。
  • 预览支持使用标识而不是用于连接到存储提供程序的机密。

可在 Azure/durabletask GitHub 存储库中找到 Azure 存储存储提供程序的 DTFx 组件的源代码。

注意

使用 Azure 存储提供程序时,需要标准常规用途 Azure 存储帐户。 所有其他存储帐户类型均不受支持。 强烈建议使用旧版 v1 常规用途存储帐户,因为对于 Durable Functions 工作负载而言,较新的 v2 存储帐户可能会贵得多。 若要详细了解 Azure 存储帐户类型,请参阅存储帐户概述文档。

Netherite

Netherite 存储后端由 Microsoft Research 设计和开发。 它在 Azure 页 Blob 之上使用 Azure 事件中心FASTER 数据库技术。 与其他提供程序相比,Netherite 的设计支持以更高的吞吐量处理业务流程和实体。 在某些基准方案中,与默认的 Azure 存储提供程序相比,其吞吐量提高了一个数量级以上。

Netherite 存储提供程序的主要优势包括:

  • 与其他存储提供程序相比,吞吐量明显更高,且成本更低。
  • 支持性价比优化,使你可以根据需要扩展性能。
  • 最多支持 32 个数据分区,其中包含事件中心基本和标准 SKU。
  • 与用于高吞吐量工作负载的其他提供程序相比,更为经济高效。

请参阅 Netherite 文档,详细了解 Netherite 存储提供程序的技术细节,包括如何开始使用它。 可在 microsoft/durabletask-netherite GitHub 存储库中找到 Netherite 存储提供程序的源代码。 有关对 Netherite 存储提供程序的更深入评估,请参阅以下研究论文:配置了 Durable Functions 和 Netherite 的无服务器工作流

注意

Netherite 一名源自 Minecraft 世界。

Microsoft SQL Server (MSSQL)

Microsoft SQL Server (MSSQL) 存储提供程序将所有状态持久保存到 Microsoft SQL Server 数据库中。 它与 SQL Server 的本地部署和云托管部署均兼容,包括 Azure SQL 数据库

MSSQL 存储提供程序的主要优势包括:

  • 支持断开连接的环境 - 使用 SQL Server 安装时不需要 Azure 连接。
  • 可跨多个环境和云(包括 Azure 托管的和本地)进行移植。
  • 强大的数据一致性,支持备份/还原和故障转移,而不会丢失数据。
  • 对自定义数据加密(一种 SQL Server 功能)的本机支持。
  • 通过内置的存储过程与现有数据库应用程序集成。

请参阅 Microsoft SQL 提供程序文档,详细了解 MSSQL 存储提供程序的技术细节,包括如何开始使用它。 可在 microsoft/durabletask-mssql GitHub 存储库中找到 MSSQL 存储提供程序的源代码。

配置备用存储提供程序

配置备用存储提供程序通常是一个两个步骤的进程:

  1. 将相应的 NuGet 包添加到函数应用(对于使用扩展捆绑包的应用,此要求是临时的)。
  2. 更新 host.json 文件以指定要使用哪个存储提供程序。

如果 host.json 中未显式配置任何存储提供程序,则默认启用 Azure 存储提供程序。

配置 Azure 存储提供程序

Azure 存储提供程序是默认的存储提供程序,不需要任何显式配置、NuGet 包引用或扩展捆绑包引用。 可以在 extensions/durableTask/storageProvider 路径下的此处找到完整的 host.json 配置选项集。

连接

host.json 中的 connectionName 属性是对环境配置的引用,它指定应用应如何连接到 Azure 存储。 它可能指定:

如果配置的值既是单个设置的完全匹配,也是其他设置的前缀匹配,则使用完全匹配。 如果未在 host.json 中指定任何值,则默认值为“AzureWebJobsStorage”。

基于标识的连接

如果使用 2.7.0 版或更高版本的扩展和 Azure 存储提供程序,而可以让应用使用 Microsoft Entra 标识,而无需将连接字符串与机密一起使用。 为此,需要定义公共前缀下的设置,该前缀映射到触发器和绑定配置中的 connectionName 属性。

若要将基于标识的连接用于 Durable Functions,请配置以下应用设置:

属性 环境变量模板 说明 示例值
Blob 服务 URI <CONNECTION_NAME_PREFIX>__blobServiceUri 存储帐户的 blob 服务的数据平面 URI,使用 HTTPS 方案。 https://<storage_account_name>.blob.core.chinacloudapi.cn
队列服务 URI <CONNECTION_NAME_PREFIX>__queueServiceUri 存储帐户的队列服务的数据平面 URI,使用 HTTPS 方案。 https://<storage_account_name>.queue.core.chinacloudapi.cn
表服务 URI <CONNECTION_NAME_PREFIX>__tableServiceUri 存储帐户的表服务的数据平面 URI,使用 HTTPS 方案。 https://<storage_account_name>.table.core.chinacloudapi.cn

可以设置其他属性来自定义连接。 请参阅基于标识的连接的通用属性

在 Azure Functions 服务中托管时,基于标识的连接将使用托管标识。 默认情况下使用系统分配的标识,但可以使用 credentialclientID 属性来指定用户分配的标识。 请注意,不支持为用户分配的标识配置资源 ID。 在其他上下文(如本地开发)中运行时,将改用开发人员标识,尽管可以进行自定义。 请参阅使用基于标识的连接进行本地开发

向标识授予权限

无论使用何种标识,都必须具有执行所需操作的权限。 需要使用内置角色或者提供这些权限的自定义角色在 Azure RBAC 中分配角色

重要

某些权限可能由并非所有上下文都需要的目标服务公开。 尽可能遵循最低权限原则,仅授予标识所需的权限。 例如,如果应用只需要从数据源进行读取即可,则使用仅具有读取权限的角色。 分配一个也具有该服务写入权限的角色并不恰当,因为对于读取操作来说,写入是多余的权限。 同样,你也希望确保角色分配的范围仅限于需要读取的资源。

你将需要创建一个角色分配,以便在运行时提供对 Azure 存储的访问权限。 所有者等管理角色还不够。 在正常操作中使用 Durable Functions 扩展时建议使用以下内置角色:

根据所编写的代码,应用程序可能需要更多权限。 如果使用默认行为或将 connectionName 显式设置为“AzureWebJobsStorage”,请参阅使用标识连接到主机存储,了解其他权限注意事项。

配置 Netherite 存储提供程序

启用 Netherite 存储提供程序需要在 host.json 中更改配置。 C# 用户还需要一个额外的安装步骤。

host.json 配置

以下 host.json 示例显示了启用 Netherite 存储提供程序所需的最低配置。

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "Netherite",
        "storageConnectionName": "AzureWebJobsStorage",
        "eventHubsConnectionName": "EventHubsConnection"
      }
    }
  }
}

有关更详细的设置说明,请参阅 Netherite 入门文档

安装 Netherite 扩展(仅 .NET)

注意

如果应用使用扩展捆绑包,则应忽略此部分,因为扩展捆绑无需手动管理扩展。

需要安装 NuGet 上最新版本的 Netherite 扩展。 这通常意味着在 .csproj 文件中包含对它的引用并生成项目。

要安装的扩展包取决于所使用的 .NET 辅助角色:

配置 MSSQL 存储提供程序

启用 MSSQL 存储提供程序需要在 host.json 中更改配置。 C# 用户还需要一个额外的安装步骤。

host.json 配置

以下示例显示了启用 MSSQL 存储提供程序所需的最低配置。

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "mssql",
        "connectionStringName": "SQLDB_Connection"
      }
    }
  }
}

有关更详细的设置说明,请参阅 MSSQL 提供程序的入门文档

安装持久任务 MSSQL 扩展(仅 .NET)

注意

如果应用使用扩展捆绑包,则应忽略此部分,因为扩展捆绑无需手动管理扩展。

需要安装 NuGet 上的最新版本的 MSSQL 存储提供程序扩展。 这通常意味着在 .csproj 文件中包含对它的引用并生成项目。

要安装的扩展包取决于所使用的 .NET 辅助角色:

比较存储提供程序

各种支持的存储提供程序之间有许多需要权衡的重要方面。 下表可用于帮助你了解这些权衡点,并决定哪种存储提供程序最适合你的需求。

存储提供程序 Azure 存储 Netherite MSSQL
官方支持状态 ✅ 正式发布 (GA) ✅ 正式发布 (GA) ✅ 正式发布 (GA)
外部依赖关系 Azure 存储帐户(常规用途 v1) Azure 事件中心
Azure 存储帐户(常规用途)
SQL Server 2019 或 Azure SQL 数据库
本地开发和仿真选项 Azurite v3.12+(跨平台) 支持任务中心的内存中仿真(详细信息 SQL Server Developer 版(支持 WindowsLinuxDocker 容器
任务中心配置 显式 显式 默认情况下为隐式(详细信息
最大吞吐量 中等 很高 中等
最大业务流程/实体横向扩展(节点) 16 32 不适用
最大活动横向扩展(节点) 不适用 32 不适用
KEDA 2.0 缩放支持
详细信息
❌ 不支持 ❌ 不支持 ✅ 使用 MSSQL 缩放器支持(详细信息
支持扩展捆绑包(建议用于非 .NET 应用) ✅ 完全支持 ✅ 完全支持 ✅ 完全支持
性价比可配置? ❌ 否 ✅ 是(事件中心 TU 和 CU) ✅ 是(SQL vCPU)
断开连接的环境支持 ❌ 需要 Azure 连接 ❌ 需要 Azure 连接 ✅ 完全支持
基于标识的连接 ✅ 完全支持 ❌ 不支持 ⚠ 需要运行时驱动的缩放

后续步骤