是什么会导致CosmosDB偶尔读取速度慢?

时间:2018-07-24 09:06:05

标签: c# azure azure-web-sites azure-cosmosdb latency

使用Microsoft.Azure.DocumentDB nuget包中的.Net API从Azure cosmosDB集合读取文档时,我遇到了奇怪的延迟峰值。

记录摘要以读取同一文档100次:

Reading 126: 31ms
Reading 126: 12ms
Reading 126: 29ms
Reading 126: 1172ms
Reading 126: 1197ms
Reading 126: 29ms
Reading 126: 29ms
Reading 126: 42ms

这样的峰值不能始终如一地重现,但是我使用以下所示的测试方法在同时触发约100个请求时重现了它们。延迟增加不是渐进的,而是跳跃了1+秒(甚至更多),这令人怀疑。某种饥饿,但是在哪里?

这种等待时间峰值可能是什么原因?该如何解决?

其他详细信息:

  • 使用最新的.NET DocumentClient版本(1.22.0)
  • 由Azure应用服务中的客户端测试是否击中了同一地区的CosmosDB集合。
  • 使用静态字段重用DocumentClient
  • ConnectionPolicy = TCP + Direct
  • 文档大小无关紧要,也可以仅使用ID的文档复制。
  • 延迟时间是通过ResourceResponseBase.RequestLatency Property测量的。
  • 无需服务器限制-客户端或Azure门户日志中均不使用HTTP 429,因此可以提供足够的吞吐量。
  • 此延迟不会在Azure门户的指标中显示-客户端中正在等待。
  • 我已经看到生产中的延迟增加到10 ish秒,在人工测试中增加到30 ish秒。
  • 有趣的是,SQL API查询和写入似乎不会引起这样的等待(虽然没有那么频繁,但不是确定性的)

用于测试的代码:

public async Task<String> Test(int count)
{
    var tasks = Enumerable.Range(1, count)
        .Select(async (row, index) =>
        {
            string documentId = "1";
            var documentUri = UriFactory.CreateDocumentUri(@"db", "test", documentId);
            var result = await Client.ReadDocumentAsync(documentUri).ConfigureAwait(false);
            return "Reading " + documentId + ": " + (int)result.RequestLatency.TotalMilliseconds + "ms";
        });
    String[] results = await Task.WhenAll(tasks).ConfigureAwait(false);
    return String.Join("<br/>", results);
}

0 个答案:

没有答案