【问题标题】:Azure Functions: binding to DocumentClient versus static instance - what's recommended?Azure Functions:绑定到 DocumentClient 与静态实例 - 推荐什么?
【发布时间】:2019-05-24 07:42:50
【问题描述】:

我知道如何将查询直接绑定到 Azure 函数并在函数中使用 Cosmos DB 触发器。

但是,我正在寻找直接使用DocumentClient(Nuget 包Microsoft.Azure.Cosmos)的方向。

  1. documentation 解释了如何在执行之间重用静态客户端实例。
  2. 还可以通过将[DocumentDB("test", "test", ConnectionStringSetting = "CosmosDB")] DocumentClient client 添加到函数的参数来获取DocumentClient 实例作为绑定。
  3. 最后,可以在函数体中创建DocumentClient 实例:var client = new DocumentClient(...)

我没有找到明确的建议何时使用哪种方法,除了由于性能、内存使用和连接限制,数字 3 永远不是一个好的选择。另外,我知道使用静态实例具有优势。

问题

  • Azure 函数有连接限制 (discussed here)。这在使用方法 2(绑定到客户端)时是否也适用?
  • 使用方法 2(绑定)与方法 1(静态)的优缺点是什么?
  • 与绑定到 DocumentClient 并在函数体中创建查询相比,绑定到 SQL 查询有什么优势?

【问题讨论】:

    标签: c# azure azure-functions


    【解决方案1】:

    还有另一种使用 DocumentClient 的方法。 从 Microsoft.NET.Sdk.Functions 1.0.28 版本开始,现在可以使用 FunctionsStartup 类初始化 DocumentClient 一次,然后将其注册为 DI(依赖注入),然后每次都使用相同的实例。

    FunctionsStartup 类记录在 here。更好的解释是here

    在您的 Startup 的配置方法中,构建您的客户端。

    using Microsoft.Azure.Functions.Extensions.DependencyInjection;
    using Microsoft.Extensions.DependencyInjection;
    [assembly: FunctionsStartup(typeof(MyApp.Startup))]
    namespace MyApp
    {
        public class Startup : FunctionsStartup
        {
            public override void Configure(IFunctionsHostBuilder builder)
            {
                IDocumentClient client = GetCustomClient();
                builder.Services.AddSingleton<IDocumentClient>(client);
            }
    }
    

    然后可以将其注入函数构造函数并由方法使用。

    public class MyFunction
    {
        private IDocumentClient _client;
    
        public MyFunction(IDocumentClient client)
        {
            _client = client;
        }
    
        [FunctionName("MyFunction")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            // use _client here.
        }
    }
    

    当 Azure 创建此类的实例来处理请求时,它会传递在 FunctionsStartup 类中创建的 IDocumentClient 实例。

    此策略允许重用 DocumentClient 的相同实例。这个客户端的单一性不是通过使其静态来强制的,而是通过确保我们只创建一次。这也有助于提高可测试性,因为测试可以注入不同的 IDocumentClient 实例。

    【讨论】:

    【解决方案2】:

    This article 非常适合静态客户端。

    我们都知道这种方法对于 HttpClient 的弊端(如果你 不要,请在本文后立即阅读!),它有确切的 此处的效果相同:如果函数获得大量 触发器,我们不仅会惩罚我们的表现 具有初始化开销但内存的数据库调用 消耗会增加,我们甚至可能会导致套接字耗尽 场景。

    对于您的问题 2 和 3: 使用绑定的最大优点是简单。客户等的所有创建都从您那里抽象出来。这当然是控制。 Here 是使用自定义客户端的一个很好的例子。

    使用 SQL 查询而不是 DocumentClient 在抽象方面更上一层楼。

    【讨论】:

    • 那篇博文部分重复了我写的内容,但并不包括所有原因:存在连接限制。它确实强调了使用静态实例,但没有解释绑定到DocumentClient 的优势是什么。我也更新了我的问题。
    • Using the SQL query instead of the DocumentClient is one step further up in regards to abstraction. - 这不是倒退吗?
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多