【问题标题】:Any ways to cache DocumentClient of Azure Cosmos DB for better performance?有什么方法可以缓存 Azure Cosmos DB 的 DocumentClient 以获得更好的性能?
【发布时间】: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


【解决方案1】:

您可以将 DocumentClient 存储到一个静态变量中,并在应用程序实例中重复使用它。 例如

public class CosmosDbRepo : ICosmosDbRepo
{
   private static DocumentClient _cosmosDocumentClient; 
   public CosmosDbRepo(IDatabaseFactory databaseFactory, CosmosDbConnectionParameters cosmosDbConnectionParameters)
    {           
        _collectionUri = UriFactory.CreateDocumentCollectionUri(cosmosDbConnectionParameters.DatabaseId, cosmosDbConnectionParameters.CollectionId);

        if (_cosmosWriteDocumentClient == null)
        {
            _cosmosDocumentClient = databaseFactory.CreateDbConnection(cosmosDbConnectionParameters, ConnectionMode.Direct).DocumentClient;
        }
    }
}

_cosmosDocumentClient 然后可以被您的应用程序的多个实例使用。

我目前正在开发一个使用这种静态 cosmosdb 连接的 Azure 函数应用。 Azure 函数应用的实例共享静态对象。

如果您运行然后关闭命令行程序,则每次启动程序时都必须重新创建静态连接,并且您不会从静态连接中获得太多好处。使程序连续运行会有所帮助。您可能有多个线程处理多个工作单元实例,这些工作单元处理您的程序执行的作业,并且这些多个实例可以共享静态 cosmos db 连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-19
    • 2013-03-24
    • 2012-06-22
    • 2011-01-30
    • 1970-01-01
    • 2018-10-16
    • 2011-02-07
    • 2013-11-26
    相关资源
    最近更新 更多