通过


优化批量操作的性能

如果需要在 Dataverse 中创建或更新数千条或数百万条记录,所做的选择可以节省批量操作项目完成的时间。 本文介绍影响性能的因素以及构建客户端应用程序以优化批量操作性能的选项。 还应考虑其他因素,例如记录数、记录大小、网络延迟和数据复杂性。

表类型

选择存储数据的表类型对批量操作预期吞吐量的影响最大。 Dataverse 提供两种类型的表:标准和弹性表。

  • 标准表使用 Azure SQL 存储数据。 标准表为关系建模提供事务支持和更大的功能。
  • 弹性表使用 Azure Cosmos DB 存储数据。 弹性表会自动水平缩放,以处理大量数据和高吞吐量级别,延迟较低。 弹性表适用于负载具有不可预知、突发或快速增长的应用程序。

如果数据加载时间是主要问题,弹性表可提供最佳性能。 了解何时使用弹性表

业务逻辑

Dataverse 提供在使用插件创建或更新记录时添加额外业务逻辑的功能。可以在标准表操作的事务之前或事务中注册插件以同步运行。 由于不存在事务,弹性表支持在操作开始前执行的插件。 在标准表的同步步骤或弹性表中的操作之前,插件代码中发生的任何错误将取消该操作。 插件开发人员可以故意引发异常来取消操作,以确保应用数据验证逻辑。

注册以同步运行的任何插件会增加操作完成的时间。 若要保留性能,需要:

  • 限制为操作注册的同步插件数。 除非必须同步应用逻辑,否则请使用异步插件或 Power Automate 流来添加异步运行的逻辑。
  • 确保您拥有的插件在尝试执行的逻辑方面受到限制。 虽然插件必须在宽松的两分钟时间限制内完成,但运行超过两秒的同步插件会严重降低性能。
  • 确保仅在必要时运行插件。 筛选插件,以便仅在更新特定列时运行更新操作。
  • 确保对插件进行优化,以便尽可能高效地执行逻辑。 对于标准表,您需要考虑事务和记录锁对性能可能产生的影响。 了解可缩放的自定义设计 和其他 编写插件的最佳做法
  • 选择要注册插件的 API。 可以应用同步逻辑,以在更高效 CreateMultipleUpdateMultiple 批量操作 API 上运行。 了解如何为 CreateMultiple 和 UpdateMultiple 编写插件

绕过业务逻辑

若要加快批量操作项目的速度,请禁用为创建或更新操作注册的插件以提高性能。 如果业务逻辑不重要,或者计划其他步骤以确保最终数据一致性,请手动禁用插件步骤,并在批量操作项目完成时重新启用它们。 但是,禁用插件将导致无法从任何客户端应用该逻辑。 在此期间向 Dataverse 添加数据的任何用户或其他进程都不会应用任何业务逻辑。

作为执行批量操作的客户端应用程序的开发人员,可以将 可选参数 应用于发送到绕过逻辑的请求。 只有系统管理员或被授予特定权限的用户才能使用此标头。 详细了解如何绕过自定义 Dataverse 逻辑

批量操作 API

Dataverse 提供 批量操作 API ,可实现创建和更新操作的最大可能吞吐量。 这些 API 包括CreateMultipleUpdateMultipleUpsertMultiple。 仅限弹性表,您可以使用 DeleteMultiple

虽然这些 API 提供最高的吞吐量,但它们对标准表具有以下限制:

  • 目前不适用于所有表。 任何自定义表都支持它们,但并非所有核心 Dataverse 表都支持它们,例如帐户或联系人。 可以运行文档中提供的查询,以确定表是否可以使用这些 API。
  • 不宽容数据错误。 需要确保正在更改的数据经过仔细清理和验证。 在这些 API 中的一个操作中发生的任何错误都会导致整个操作失败。
  • 不支持在插件中使用。 目前,只有外部客户端应用程序才应使用这些 API。

批量操作适用于所有弹性表,弹性表可以返回有关失败的各个操作的信息。 详细了解批量操作中使用的弹性表

批处理 API

如果无法使用批量操作 API,请通过 SDK for .NET 使用 ExecuteMultiple ,并将 OData $batch 与 Web API 配合使用。

使用这些 API 在单个请求中对一组操作进行分组,并实现更大的效率,这主要是由于请求较少、更大的请求减少了通过网络发送和接收的每个操作的总有效负载。 在发送下一个请求之前,客户端应用程序无需等待操作完成。

请求中的每个操作在服务器上按顺序应用,因此每个操作的效率没有提高。 但是,由于操作是单独执行的,因此可以获取有关哪些操作失败的信息,或者在发生错误时停止批处理。 每个请求最多可以发送 1,000 个操作,但为了获得最佳结果,请从较小的数量和试验开始,以确定哪种大小批最适合你的情况。

注释

批量操作和批处理 API 在并行使用时都看到了显著的性能提升。 请参阅 并行请求

客户端体系结构

Dataverse 设计为数据源,以支持具有大量并发用户的多个应用程序。 若要优化吞吐量,请将客户端设计为使用 Dataverse 的优势。

客户端代码中的瓶颈是性能问题的主要原因。 开发人员经常无法使用代码的功能,这可能会影响性能。 优化客户端应用程序如何利用基础结构的核心或计算至关重要,因为无法优化可能会显著影响性能。 例如,使用 Azure Functions 时,采取额外的步骤来优化性能,例如实现自动缩放、使用预热实例、调整 CPU 使用率、利用多个核心并允许并发。

服务保护限制

为了确保每个人的可用性和性能一致,Dataverse 对 API 的使用方式应用了一些限制。 这些限制可检测客户端应用程序何时对服务器资源提出异常要求。 批量操作项目总是会产生巨大的需求,因此您需要做好准备来处理服务保护限制返回的错误。 如果未收到某些服务保护限制错误,则尚未最大化应用程序的功能。

服务保护限制错误只是客户端应准备好处理的另一种暂时性错误,例如暂时丢失网络连接。 弹性客户端应用程序必须通过等待和重试来响应错误。 唯一的区别在于,服务保护限制会告诉你重试前需要等待多长时间。

若要了解详细信息,请参阅:

并行请求

可以通过 并行发送请求来显著改善吞吐量,但需要了解如何正确发送请求。

并非所有环境都相同

并非每个 Dataverse 环境都分配了相同数量的 Web 服务器资源。 Dataverse 根据环境需求进行扩展,通过添加更多 Web 服务器资源来支持环境。 支持数千个活动用户的生产环境需要比试用环境更多的 Web 服务器。 当环境包含大量 Web 服务器时,并行发送请求可能会显著改变客户端应用程序可以实现的总吞吐量。

Dataverse 在响应标头中返回数据,该标头告知你适用于你的环境的建议的并行度(DOP)。 如果发送的并行请求多于响应标头建议,性能会恶化。 用于运行应用程序的客户端硬件可能需要更多 CPU 核心才能并行发送许多请求。 可能需要使用更多客户端来获取最大吞吐量。 例如,可以使用横向扩展的应用服务或 Azure 函数。

根据客户端体系结构,可能需要拆分建议的并行度。 例如,如果有两个客户端,并且建议的 DOP 为 50,请将每个客户端配置为使用 25。

禁用 Azure 亲和性

如果合适,在将客户端配置为使用所有可用的 Web 服务器时,会看到最佳结果,方法是删除尝试将应用程序关联到单个 Web 服务器的 Azure 关联 Cookie 。 禁用 Azure 相关性不适用于使用服务器中缓存数据的交互式应用程序来优化用户体验。

优化连接

使用 .NET 时, 应用配置更改,如下所示 以优化连接,以便请求不受默认设置的限制。

// Bump up the min threads reserved for this app to ramp connections faster - minWorkerThreads defaults to 4, minIOCP defaults to 4 
ThreadPool.SetMinThreads(100, 100);
// Change max connections from .NET to a remote service default: 2
System.Net.ServicePointManager.DefaultConnectionLimit = 65000;
// Turn off the Expect 100 to continue message - 'true' will cause the caller to wait until it round-trip confirms a connection to the server 
System.Net.ServicePointManager.Expect100Continue = false;
// Can decrease overall transmission overhead but can cause delay in data packet arrival
System.Net.ServicePointManager.UseNagleAlgorithm = false;

建议摘要

根据前面所述的因素,按照这些建议优化批量操作项目的吞吐量:

  • 选择符合要求的表类型。 弹性表在处理批量操作时具有更大的容量。
  • 最小化、禁用或绕过正在使用的表上的自定义业务逻辑。 将客户端应用程序配置为在适当情况下绕过自定义逻辑。
  • 如果可以,请使用 Dataverse 批量操作 API,否则请使用批处理 API。
  • 设计客户端应用程序以处理临时错误,包括服务保护限制返回的错误。
  • 并行发送请求。 使用响应头来指导您确定推荐的并行度 (DOP)。 适当时禁用关联 Cookie。
  • 验证数据以确保它符合表列架构。 此验证有助于防止错误并减少失败的操作数。

另见

弹性表
使用插件扩展业务流程
绕过自定义 Dataverse 逻辑
批量操作消息
为 CreateMultiple 和 UpdateMultiple 编写插件
发送并行请求