【发布时间】:2019-01-18 07:50:09
【问题描述】:
我正在开发一个由 Azure Cosmos DB(SQL API 版本)提供支持的常用命令行工具。它需要在启动后检查一些文档,我发现创建 DocumentClient 并找到集合总共需要 5 秒。
所以我想知道是否有任何解决方案可以在本地缓存 DocumentClient 或 Database/DocumentCollection 连接或其他方式来提高 Cosmos DB 相关性能?
这是我的代码 --- 我说的是构造函数:
public static class CacheUtils
{
private static readonly string DatabaseName = "myDatabase";
private static readonly string CollectionName = "myLruCache";
private static DocumentClient Client { get; }
private static Database Database { get; }
private static DocumentCollection DocumentCollection { get; }
static CacheUtils()
{
var connectionPolicy = new ConnectionPolicy
{
EnableEndpointDiscovery = true,
ConnectionMode = ConnectionMode.Direct,
ConnectionProtocol = Protocol.Tcp,
RequestTimeout = TimeSpan.FromSeconds(3),
RetryOptions = new RetryOptions
{
MaxRetryAttemptsOnThrottledRequests = 3,
MaxRetryWaitTimeInSeconds = 10
}
};
Client = new DocumentClient(new Uri(myEndpoint), myAccessToken, connectionPolicy);
Client.OpenAsync().GetResultSafe();
Database = Client.CreateDatabaseIfNotExistsAsync(new Database {Id = DatabaseName}).GetResultSafe().Resource;
DocumentCollection = Client.CreateDocumentCollectionIfNotExistsAsync(
Database.SelfLink,
new DocumentCollection {Id = CollectionName, DefaultTimeToLive = -1},
new RequestOptions {OfferThroughput = 1000}).GetResultSafe().Resource;
}
// Omit CRUD operation wrappers
}
为了衡量初始化过程的时间成本,添加了Stopwatch:
var s1 = new Stopwatch();
s1.Start();
Console.WriteLine($"[{s1.Elapsed.TotalSeconds:F3}] DocDB Start");
Client = new DocumentClient(new Uri(endpoint), accessToken, connectionPolicy);
Client.OpenAsync().GetResultSafe();
Console.WriteLine($"[{s1.Elapsed.TotalSeconds:F3}] DocDB Client Done");
Database = Client.CreateDatabaseIfNotExistsAsync(new Database { Id = DatabaseName }).GetResultSafe().Resource;
Console.WriteLine($"[{s1.Elapsed.TotalSeconds:F3}] DocDB DB Done");
DocumentCollection = Client.CreateDocumentCollectionQuery(Database.SelfLink).Where(c => c.Id == CollectionName).ToList().FirstOrDefault();
Console.WriteLine($"[{s1.Elapsed.TotalSeconds:F3}] DocDB Coll Done");
跑了三遍:
# 1
[0.000] DocDB Start
[3.064] DocDB Client Done
[3.143] DocDB DB Done
[3.363] DocDB Coll Done
# 2
[0.000] DocDB Start
[2.256] DocDB Client Done
[2.314] DocDB DB Done
[2.617] DocDB Coll Done
# 3
[0.000] DocDB Start
[2.684] DocDB Client Done
[2.788] DocDB DB Done
[3.331] DocDB Coll Done
【问题讨论】:
-
我怀疑您最大的延迟问题是每次应用启动时都重复尝试创建数据库和集合。如果您分别创建这些文件,那么您可以只查询您的文档,而无需预先进行两次往返的仪式。
-
@DavidMakogon 不完全是。根据我的测试,创建
Client大约需要 3 秒,如果 DB 或 Coll 已经存在,“创建”它们与查询它们一样快。我将在帖子中更新有关此内容的更多详细信息。
标签: c# .net azure caching azure-cosmosdb