Azure中用于并行查询的CosmosDB SocketException

Azure中用于并行查询的CosmosDB SocketException,azure,azure-web-app-service,azure-cosmosdb,Azure,Azure Web App Service,Azure Cosmosdb,我们在Azure中有一个web应用程序(asp.net core 3.1)查询CosmosDB数据库(具有自动缩放功能)。出于性能原因,我通过首先创建Task数组,然后运行Task.whalll(..)来并行处理所有查询。当数组变得太大(~3000)时,我经常会得到SocketException。问题是,这是随机的,因为我从来没有在我的本地开发PC和Azure上得到它,当它工作时,数据会在几秒钟后返回 在应用程序洞察中,失败的查询显示为 第一个响应为200,持续时间约为100 ms 然后我可以

我们在Azure中有一个web应用程序(asp.net core 3.1)查询CosmosDB数据库(具有自动缩放功能)。出于性能原因,我通过首先创建
Task
数组,然后运行
Task.whalll(..)
来并行处理所有查询。当数组变得太大(~3000)时,我经常会得到SocketException。问题是,这是随机的,因为我从来没有在我的本地开发PC和Azure上得到它,当它工作时,数据会在几秒钟后返回

在应用程序洞察中,失败的查询显示为

  • 第一个响应为200,持续时间约为100 ms
  • 然后我可以有200个响应,持续4-5秒
  • 然后出现持续时间约20秒的故障
我看到人们推荐的唯一设置是CosmosDB客户端的类似设置:

client = new DocumentClient(
  new Uri(..), 
  Key,
  new ConnectionPolicy()
  {
    ConnectionMode = ConnectionMode.Direct,
    ConnectionProtocol = Protocol.Tcp,
    IdleTcpConnectionTimeout = new TimeSpan(0, 10, 0, 0)
});
其他哪些设置可能是相关的?我已经尝试了
maxRequestsPertcConnection=16
OpenTCPCConnectionTimeout=new TimeSpan(0,1,0,0)
RequestTimeout=new TimeSpan(0,1,0,0)
,但似乎都没有任何效果

更新2020-10-24:

连接的数量可能是并行连接的一个限制,但我不知道如何以一种简单的方式处理这个问题,因为有时查询会运行良好,而有时则不会

然而,解决方案是避免手动并行,并让CosmosDB以任何优化方式处理此问题。我已经很久没有编写这些并行查询了,这可能是性能和RU/s之间的权衡,因为查询是跨分区的。代码必须处理427个错误,但当我转到自动缩放时,这个错误被删除了。并行代码现在被重写为跨分区,最大并发性=-1,ref

代码方面,第一个查询是:

var query = client.CreateDocumentQuery<MyClass>(
  UriFactory.CreateDocumentCollectionUri(db, collection),
  new FeedOptions 
  { 
    MaxItemCount = -1 
  })
  .Where(q => q.PartitionKey == partitionKey)
  .AsDocumentQuery();
var query=client.CreateDocumentQuery(
CreateDocumentCollectionUri(数据库,集合),
新的饲料选择
{ 
MaxItemCount=-1
})
.Where(q=>q.PartitionKey==PartitionKey)
.AsDocumentQuery();
我将其添加到每个分区键的任务列表中

然后是交叉分区:

var partitionKeys = <list of partition keys>; 
var query = client.CreateDocumentQuery<MyClass>(
  UriFactory.CreateDocumentCollectionUri(db, collection),
  new FeedOptions
  {
    MaxItemCount = -1,
    EnableCrossPartitionQuery = true,
    MaxDegreeOfParallelism = -1
  })
  .Where(q => partitionKeys.Contains(q.PartitionKey))
  .AsDocumentQuery();
var partitionKeys=;
var query=client.CreateDocumentQuery(
CreateDocumentCollectionUri(数据库,集合),
新的饲料选择
{
MaxItemCount=-1,
EnableCrossPartitionQuery=true,
MaxDegreeOfParallelism=-1
})
.Where(q=>PartitionKey.Contains(q.PartitionKey))
.AsDocumentQuery();

您可能正在同时连接上运行Azure应用程序服务:

每个实例的最大IP连接数取决于该实例 大小:每B1/S1/P1V3实例1920个,每B2/S2/P2V3实例3968个, 每个B3/S3/P3V3实例8064个

因此,增加实例大小可能会有所帮助。但这需要管理大量的关系,扩大规模并不一定是最好的方法。在SDK中使用批量支持应有助于整合这些同步连接:

您是否看到超时?