首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET Azure函数应用程序使用UpsertItemAsync上传到CosmosDB的速度非常慢,特别是与CosmosClient相比

.NET Azure函数应用程序使用UpsertItemAsync上传到CosmosDB的速度非常慢,特别是与CosmosClient相比
EN

Stack Overflow用户
提问于 2021-04-26 13:27:35
回答 1查看 250关注 0票数 0

我有一个运行在Azure上的.NET函数应用程序,它将数据上传到CosmosDB,如下所示:

代码语言:javascript
复制
foreach (var message in messages)
{
    try
    {
        await notificationsContainer.UpserItemAsync(message, message.NTID);
    }
    catch (Exception exception)
    {
        //...
    }
}

UpsertItemAsync是一个包装器:

代码语言:javascript
复制
public async Task<T> UpsertItemAsync(T document, string partitionKey)
{
    ItemResponse<T> response = await _container.UpsertItemAsync<T>(document, new PartitionKey(partitionKey));
    return response.Resource;
}

我在做6500条短信的测试。上传640(!)花了16分钟。发送到数据库的消息。同时,使用Python的CosmosClient,这个调用

container.create_item(message)

乘以6500,需要131秒才能完成。

此外,函数应用程序运行在Azure上,CosmosClient设置为直接连接模式:

代码语言:javascript
复制
 CosmosClient client = clientBuilder
    .WithConnectionModeDirect()
    .WithThrottlingRetryOptions(new TimeSpan(0, 0, 0, 0, config.MaxRetryWaitTimeInMilliSeconds), config.MaxRetryCount)
    .WithBulkExecution(true)
    .Build();

当python脚本在on上运行时。

如何解释这种表现上的巨大差异?这个函数应用程序是不是太慢了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-26 13:54:50

您的问题是,您正在启用大容量模式(.WithBulkExecution(true)),但对每个操作执行await

当使用大容量模式(引用https://devblogs.microsoft.com/cosmosdb/introducing-bulk-support-in-the-net-sdk/)时,您需要创建这些操作,而不是单独等待。类似于:

代码语言:javascript
复制
List<Task> operations = new List<Task>();
foreach (var message in messages)
{
    operations.Add(notificationsContainer.UpserItemAsync(message, message.NTID));
}

try
{
    await Task.WhenAll(operations);
}
catch(Exception ex)
{
    //...
}

如果要执行单独的操作执行,可以禁用大容量模式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67267567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档