建立多個適用於 Azure Cosmos DB 的 Azure Functions 觸發程序
適用於:NoSQL
本文說明如何將多個適用於 Azure Cosmos DB 的 Azure Functions 觸發程序設定為平行運作,並獨立回應變更。
以事件為基礎的架構需求
使用 Azure Functions 建置無伺服器架構時,建議您建立一起運作的小型函式集,而不是大量長時間執行的函式。
當您使用適用於 Azure Cosmos DB 的 Azure Functions 觸發程序建置事件型無伺服器流程時,您會遇到一種情況,亦即每當特定 Azure Cosmos 容器中有新事件,您就想執行多個動作。 如果您要觸發的動作彼此獨立,理想的解決方式是為您想執行的每個動作分別建立一個適用於 Azure Cosmos DB 的 Azure Functions 觸發程序,且全都接聽同一個 Azure Cosmos 容器的變更。
最佳化多個觸發程序的容器
考慮到「適用於 Azure Cosmos DB 的 Azure Functions 觸發程序」的需求,我們需要第二個容器來儲存狀態,該容器也稱為「租用容器」。 這表示每個 Azure 函式都需要個別的租用容器嗎?
在此,您有兩個選項:
- 建立每個函式一個租用容器:除非您使用共用輸送量資料庫,否則這種方法可能會轉變成額外的費用。 請記住,容器層級的最小輸送量為 400 個要求單位,而在租用容器的案例中,只會用來檢查進度及維護狀態。
- 具有一個租用容器並加以共用 (針對您所有的函式):此第二個選項可更加妥善使用容器上佈建的要求單位,因為它可讓多個 Azure 函式共用及使用相同佈建的輸送量。
本文的目標是引導您完成第二個選項。
設定共用租用容器
若要設定共用租用容器,您在觸發程式上唯一需要進行的額外設定,是如果您使用 C# 或 leaseContainerPrefix
屬性,如果您使用 JavaScript,則新增 LeaseContainerPrefix
屬性。 屬性值應該是該特定觸發程序的邏輯描述項。
例如,如果您有三個觸發程序:一個會傳送電子郵件、一個會進行彙總以建立具體化檢視,還有一個會將變更傳送至另一個儲存體以供稍後分析,您可以將 LeaseContainerPrefix
為 "emails" 指派給第一個、將其值為 "materialized" 指派給第二個,以及將其值為 "analytics" 指派給第三個。
重點是這三個觸發程序可以使用相同的租用容器組態 (帳戶、資料庫和容器名稱)。
在 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 函式數目時,可能需要增加佈建的輸送量。
下一步
- 請參閱適用於 Azure Cosmos DB 的 Azure Functions 觸發程序,了解完整的設定方式。
- 請檢查擴充的範例清單以取得所有語言。
- 請瀏覽 GitHub 存放庫中 Azure Cosmos DB 與 Azure Functions 的無伺服器訣竅,以取得更多範例。