Azure中用于并行查询的CosmosDB SocketException
我们在Azure中有一个web应用程序(asp.net core 3.1)查询CosmosDB数据库(具有自动缩放功能)。出于性能原因,我通过首先创建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 然后我可以
Task
数组,然后运行Task.whalll(..)
来并行处理所有查询。当数组变得太大(~3000)时,我经常会得到SocketException。问题是,这是随机的,因为我从来没有在我的本地开发PC和Azure上得到它,当它工作时,数据会在几秒钟后返回
在应用程序洞察中,失败的查询显示为
- 第一个响应为200,持续时间约为100 ms
- 然后我可以有200个响应,持续4-5秒
- 然后出现持续时间约20秒的故障
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中使用批量支持应有助于整合这些同步连接:
您是否看到超时?