【发布时间】:2015-08-29 00:15:15
【问题描述】:
我目前正面临 Azure DocumentDB 的响应时间很慢(第一次尝试)。
集合中有 31 个对象,我将获取这些对象并返回给调用者。我使用的代码是这样的:
public async Task<List<dynamic>> Get(string collectionName = null)
{
// Lookup from Dictionary, takes literally no time
var collection = await GetCollectionAsync(collectionName);
var sw = Stopwatch.StartNew();
var query = await
_client.CreateDocumentQuery(collection.DocumentsLink,
new FeedOptions { MaxItemCount = 1000 })
.AsDocumentQuery()
.ExecuteNextAsync();
Trace.WriteLine($"Get documents: {sw.ElapsedMilliseconds} ms");
return query.ToList();
}
为了实例化客户端,我使用以下代码:
_client = new DocumentClient(new Uri(endpoint), authKey, new ConnectionPolicy
{
ConnectionMode = ConnectionMode.Direct,
ConnectionProtocol = Protocol.Tcp
});
我从Stopwatch 得到的响应时间在 360 毫秒到 1200 毫秒之间,以返回 31 个对象。对我来说,这相当很慢。如果没有自定义 ConnectionPolicy,平均响应时间约为 950 毫秒。
我在这里做错了吗?是否有可能以某种方式加快这些请求的速度?
这是 Trace 的输出,打印出秒表的经过时间:
Get documents: 1984 ms
Get documents: 1252 ms
Get documents: 1246 ms
Get documents: 359 ms
Get documents: 356 ms
Get documents: 356 ms
Get documents: 351 ms
Get documents: 1248 ms
Get documents: 1314 ms
Get documents: 1250 ms
【问题讨论】:
-
您是否尝试在与 DocumentDB 实例相同的数据中心运行代码?我对在快速的 Internet 连接上从我的系统运行操作感到非常失望(即使是一次操作也最少需要 250 毫秒),但是当我在同一个数据中心运行时,延迟低于 10 毫秒。如果不想做实验推送到数据中心,那就试试10倍数据量的查询。我怀疑你只会看到数字略有增加。如果是这样,那将证明这是从数据中心外部调用它的延迟。
-
我确实认为,从延迟的角度来看,跨越数据中心边界的成本太高了。我的互联网连接上的 ping 时间只有 50-70 毫秒。即使加倍也不能解释至少 250 毫秒的延迟。
-
我可以这么说:从同一数据中心的 SQL 服务器 (Azure) 检索 31 行比这快很多。即使行的数据多于从 DocumentDB 检索到的对象。
-
你是说你在同一个数据中心运行这段代码并且仍然得到这些数字吗?如果您从同一数据中心的 DocumentDB 中检索 31 行,您应该会获得更快的响应。如果不是,那么它一定是别的东西。当一切都在同一个数据中心时,看看 Azure SQL 如何从延迟的角度进行比较会很有趣。
-
我无法评论您的代码,因为我在 NodeJS 应用程序上使用 docdb,并且没有使用 .Net sdk 的经验,但我已经对返回的超过 5K 文档的集合运行了相当复杂的查询在 50 毫秒内。也许您的索引策略配置不正确?您的队列的 x 收费标头返回什么?
标签: c# .net azure azure-cosmosdb