创建多个适用于 Azure Cosmos DB 的 Azure Functions 触发器
适用于: NoSQL
本文介绍如何配置多个适用于 Azure Cosmos DB 的 Azure Functions 触发器,这些触发器可以并行工作并独立地对更改做出反应。
基于事件的体系结构要求
使用 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 的数量时增加预配的吞吐量。
后续步骤
- 请参阅适用于 Azure Cosmos DB 的 Azure Functions 触发器的完整配置
- 检查所有语言的扩展示例列表。
- 使用 Azure Cosmos DB 和 Azure Functions GitHub 存储库访问无服务器方案以获取更多示例。