Azure Functions:绑定到文档客户端与静态实例 - 建议什么?



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

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

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

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

问题

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

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

此处记录了 FunctionsStartup 类。更好的解释在这里。

在初创公司的配置方法中,构建客户端。

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 实例。这个客户端的Singeton性不是通过使其静态来强迫的,而是通过确保我们只创建一次来强迫的。这也有助于提高可测试性,因为测试可以注入不同的 IDocumentClient 实例。

本文为静态客户端提供了一个很好的案例。

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

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

使用 SQL 查询而不是 DocumentClient 在抽象方面更进一步。

最新更新