创建多个适用于 Azure Cosmos DB 的 Azure Functions 触发器

适用于: NoSQL

本文介绍如何配置多个适用于 Azure Cosmos DB 的 Azure Functions 触发器,这些触发器可以并行工作并独立地对更改做出反应。

Serverless event-based Functions working with the Azure Functions trigger for Azure Cosmos DB and sharing a leases container

基于事件的体系结构要求

使用 Azure Functions 生成无服务器体系结构时,建议创建协同工作的小型函数集,而不是长时间运行的大型函数。

在使用适用于 Azure Cosmos DB 的 Azure Functions 触发器生成基于事件的无服务器流时,只要特定 Azure Cosmos DB 容器中存在新事件,就会遇到要执行多项操作的场景。 如果要触发的操作彼此独立,理想的解决方案是为每个要执行的操作创建一个适用于 Azure Cosmos DB 的 Azure Functions 触发器,所有触发器侦听同一 Azure Cosmos DB 容器上的更改。

优化多个触发器的容器

鉴于适用于 Azure Cosmos DB 的 Azure Functions 触发器的要求,我们需要第二个容器(也称为租用容器)来存储状态。 这是否意味着每个 Azure 函数需要一个单独的租用容器?

可以使用以下两个选项:

  • 为每个函数创建一个租用容器 :除非使用共享吞吐量数据库,否则此方法可能会转化为其他成本。 请记住,容器级别的最小吞吐量是 400 个请求单位,对于租用容器,它仅用于检查进度和维护状态。
  • 创建一个租用容器并为所有函数共享 :第二个选项更好地利用了容器上预配的请求单元,因为它允许多个 Azure Functions 共享和使用相同的预配吞吐量。

本文的目的是指导你完成第二个选项。

配置共享的租用容器

若要配置共享的租用容器,需要在触发器上进行的唯一额外配置是在使用 C# 时添加 LeaseContainerPrefix属性,或在使用 JavaScript 时添加 leaseContainerPrefix属性。 属性的值应是特定触发器的逻辑描述符。

例如,如果有三个触发器:一个发送电子邮件,一个执行聚合以创建具体化视图,一个将更改发送到另一个存储,供以后分析,那么可以将“电子邮件”的 LeaseContainerPrefix 分配到第一个触发器,“具体化”分配到第二个触发器,“分析”分配到第三个触发器。

重要的是,所有三个触发器都可以使用相同的租用容器配置(帐户、数据库和容器名称) 。

请参阅以下非常简单的代码示例,该示例使用 C# 中的 LeaseContainerPrefix 属性:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;

[FunctionName("SendEmails")]
public static void SendEmails([CosmosDBTrigger(
    databaseName: "ToDoItems",
    containerName: "Items",
    Connection = "CosmosDBConnection",
    LeaseContainerName = "leases",
    LeaseContainerPrefix = "emails")]IReadOnlyList<MyItem> items,
    ILogger log)
{
    ...
}

[FunctionName("MaterializedViews")]
public static void MaterializedViews([CosmosDBTrigger(
    databaseName: "ToDoItems",
    containerName: "Items",
    Connection = "CosmosDBConnection",
    LeaseContainerName = "leases",
    LeaseContainerPrefix = "materialized")]IReadOnlyList<MyItem> items,
    ILogger log)
{
    ...
}

对于 JavaScript,可以使用 leaseContainerPrefix 属性在 function.json 文件上应用配置:

{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseContainerName": "leases",
    "connection": "CosmosDBConnection",
    "databaseName": "ToDoItems",
    "containerName": "Items",
    "leaseContainerPrefix": "emails"
},
{
    "type": "cosmosDBTrigger",
    "name": "documents",
    "direction": "in",
    "leaseContainerName": "leases",
    "connection": "CosmosDBConnection",
    "databaseName": "ToDoItems",
    "containerName": "Items",
    "leaseContainerPrefix": "materialized"
}

注意

始终监视共享租用容器上预配的请求单元。 共享租用容器的每个触发器都将增加吞吐量平均消耗,因此可能需要在增加使用它的 Azure Functions 的数量时增加预配的吞吐量。

后续步骤