我有一个需要大量 RU 的应用程序,但由于某种原因,我无法让客户端应用程序处理超过 1000-1500 RU,尽管集合设置为 10000 RU。显然,我可以添加更多客户端,但我需要一个客户端为我提供至少 10000 RU,然后进行扩展。 我的要求很简单
var query = connection.CreateDocumentQuery<DocumentDBProfile>(
CollectionUri, //cached
"SELECT * FROM Col1 WHERE Col1.key = '" + partitionKey + "' AND Col1.id ='" + id + "'",
new FeedOptions
{
MaxItemCount = -1,
MaxDegreeOfParallelism = 10000000,
MaxBufferedItemCount = 1000,
}).AsDocumentQuery();
var dataset = await query.ExecuteNextAsync().ConfigureAwait(false);
上面的查询命中了 150,000 个分区,每个分区都在自己的任务中(最后等待所有分区),并且客户端使用 TCP 和直接模式进行初始化:
var policy = new ConnectionPolicy
{
EnableEndpointDiscovery = false,
ConnectionMode = ConnectionMode.Direct,
ConnectionProtocol = Protocol.Tcp,
};
客户端上的 CPU 似乎已达到极限,主要是为了服务调用 query.ExecuteNextAsync()
我做错了什么吗?有什么优化技巧吗?我可以使用较低级别的 API 吗?有没有办法预解析查询或使 Json 解析更优化?
更新 通过降低并发请求数,并将反序列化类精简为具有单个属性 (id) 的类,我能够在一个客户端上获得高达 3000-4000 RU,但我仍然是 50,000 RU 限制的 10%绩效指南中提到。 不知道我还能做什么。我可以在 .Net SDK 中禁用任何安全检查或开销吗?
更新2 我们所有的测试都在同一区域 D11_V2 的 Azure 上运行。运行多个客户端可以很好地扩展,因此我们是客户端绑定(bind)而不是服务器绑定(bind)。 仍然无法达到 CosmosDB performance guideline 中概述的性能的 10%
最佳答案
默认情况下,SDK 将使用 retry policy掩盖节流错误。您是否查看过 Azure 门户上提供的 RU 指标来确认您是否受到限制?有关此内容的更多详细信息,请参阅教程 here .
不确定为什么 REST API 的性能比 .NET SDK 更好。您能否提供有关此处使用的操作的更多详细信息?
您提供的示例查询正在查询每个请求具有已知分区键和 ID 的单个文档。对于这种点读取操作,最好使用 DocumentClient.ReadDocumentAsnyc
,因为它应该比查询便宜。
关于Azure CosmosDB 我无法获得超过 1500 RU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46495013/