Azure函数:绑定到DocumentClient与静态实例-建议什么?

时间:2019-05-24 07:42:50

标签: c# azure azure-functions

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

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

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

我找不到明确的建议,何时使用哪种方法,除了3永远不是一个好选择,因为性能,内存使用情况和连接限制。另外,我知道使用静态实例也有好处。

问题

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

2 个答案:

答案 0 :(得分:1)

This article对于静态客户端来说是一个很好的例子。

  

我们都知道HttpClient使用这种方法的麻烦(如果您   请勿,请在本文后立即阅读!),它的确切内容   同样的效果在这里:如果函数的音量很大   触发因素,我们不仅会惩罚我们的表现   数据库调用具有初始化开销,但有内存   消耗会增加,甚至可能导致插槽耗尽   场景。

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

使用SQL查询代替DocumentClient是抽象方面的又一步。

答案 1 :(得分:1)

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

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

在“启动”的configure方法中,构建客户端。

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实例。