【问题标题】:Improving throughput to Dynamics CRM via asynchronous C# OData (Simple.Odata.Client)通过异步 C# OData (Simple.Odata.Client) 提高 Dynamics CRM 的吞吐量
【发布时间】:2023-02-12 01:45:15
【问题描述】:

我最近被分配到一个项目,其中所有批处理作业都通过可怕优化的 SSIS 包处理,我目前正在尝试创建 POC Console.Application 来处理整个过程。

POC 已经比 SSIS 包快 400%,因此性能提升已经让这个项目物有所值,但是我仍然对应用程序的吞吐量印象不深,我正在寻求有关如何提高性能的建议。

我正在执行所有与 CRUD 相关的操作,但我将在此处以删除为例。实体是 POCO 类,带有一个 [Table] 和大约 55 个 [Column] 注释,其中两个是 Lookup 列。所以这不是一个非常复杂的类,当然,虽然有一些数据。

使用此设置,我每秒删除大约 27 条记录,这让我印象深刻。

设置: 线程数:4(主要是让 Parallel.ForEach 自行处理,但 MaximumDegreeOfParallelism 的性能大致相同,为 4,并遵循 的准则) 最大批量大小 = 500(100-500 没有明显差异)

我根据官方文档和 POC 的大量测试得出了设置的数字。 https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/administration/operational-limits-online

我将使用 Deletion 方法作为示例,但它们都是围绕相同的逻辑构建的。

var client = GetClient();
var entityList = GetEntitiesForDeletion();
var batchMaximumSize = 500;

await Parallel.ForEachAsync(entityList.Chunk(batchMaximumSize ), async (chunk, _) =>
{
   var batch = new ODataBatch(client);

   foreach (var entity in chunk)
   {
       batch += oDataClient => oDataClient.For<Entity>()
       .Key(entity.Id)
       .DeleteEntryAsync(_);
   }

   await batch.ExecuteAsync(_);
});
public static IODataClient GetClient()
    {
        const string baseAddress = "http://crm-address/";
        const string apiUrl = "api/data/v8.2";

        var crmDomain = Environment.GetEnvironmentVariable("DOMAIN");
        var crmUsername = Environment.GetEnvironmentVariable("CRM_USERNAME");
        var crmPassword = Environment.GetEnvironmentVariable("CRM_PASSWORD");

        var httpHandler = new HttpClientHandler
        {
            Credentials = new NetworkCredential(crmUsername, crmPassword, crmDomain)
        };

        var httpClient = new HttpClient(httpHandler)
        {
            BaseAddress = new Uri(baseAddress),
        };

        var odataSettings = new ODataClientSettings(httpClient, new Uri(apiUrl, UriKind.Relative));
        odataSettings.IgnoreResourceNotFoundException = true;

        return new ODataClient(odataSettings);
    }

谁能告诉我是否遗漏了任何明显的东西?

我知道服务器的连接限制为 100,但是,我不知道如何使用所有这些。 如果这有帮助的话,我也有可能为项目创建更多的服务用户。

还是 Dynamics CRM OData WebApi 没有那么快?

提前致谢。

【问题讨论】:

    标签: c# asynchronous dynamics-crm odata batch-processing


    【解决方案1】:

    如果您实际连接到 Dynamics Business Central,请忽略它。

    Dynamics Crm 通常表示 Power Platform 中的 Dataverse / XRM,应用名称因 dynamics crm、dynamics 365 customer engagement、Dynamics sale / Service 等而异。

    如果您使用的是数据空间,在线托管版本和本地托管版本之间的指南会有所不同。

    一个好的起点(在线)是服务保护限制https://learn.microsoft.com/en-us/power-apps/developer/data-platform/api-limits?tabs=sdk#how-to-maximize-throughput 这将帮助您了解服务器端发生了什么。

    在最大化吞吐量部分,它会将您链接到此文档https://learn.microsoft.com/en-us/power-apps/developer/data-platform/send-parallel-requests?tabs=sdk

    这将有助于解释如何通过 .net 客户端或通过 web api 优化操作吞吐量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多