共用方式為


建立多個適用於 Azure Cosmos DB 的 Azure Functions 觸發程序

適用於:NoSQL

本文說明如何將多個適用於 Azure Cosmos DB 的 Azure Functions 觸發程序設定為平行運作,並獨立回應變更。

無伺服器事件型 Functions 使用適用於 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 函式共用及使用相同佈建的輸送量。

本文的目標是引導您完成第二個選項。

設定共用租用容器

若要設定共用的租用容器,您必須對觸發程序進行的唯一額外設定就是新增 LeaseContainerPrefix屬性 (若使用 C#) 或 leaseContainerPrefix屬性 (若使用 JavaScript)。 屬性值應該是該特定觸發程序的邏輯描述項。

例如,如果您有三個觸發程序:一個會傳送電子郵件、一個會進行彙總以建立具體化檢視,還有一個會將變更傳送至另一個儲存體以供稍後分析,您可以將 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 函式數目時,可能需要增加佈建的輸送量。

下一步