【发布时间】: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