この記事では、Azure Cosmos DB が並列で動作し、変更に個別に対応するように複数の Azure Functions トリガーを構成する方法について説明します。
イベント ベースのアーキテクチャの要件
Azure Functions を使用してサーバーレス アーキテクチャを構築する場合は、実行時間の長い大規模な関数ではなく、連携して動作する小さな関数セットを作成することをお勧めします。
Azure Cosmos DB 用の Azure Functions トリガーを使用してイベント ベースのサーバーレス フローを構築するときは、特定の Azure Cosmos DB コンテナーに新しいイベントが発生するたびに複数のことを行うシナリオが発生します。 トリガーするアクションが互いに独立している場合は、実行する アクションごとに Azure Cosmos DB 用に 1 つの Azure Functions トリガーを作成 し、すべて同じ Azure Cosmos DB コンテナーで変更をリッスンするのが理想的なソリューションです。
複数のトリガー用のコンテナーの最適化
Azure Cosmos DB の Azure Functions トリガーの 要件 を考えると、リース コンテナーとも呼ばれる状態を格納する 2 つ目 のコンテナーが必要です。 これは、Azure 関数ごとに個別のリース コンテナーが必要であることを意味しますか?
ここでは、次の 2 つのオプションがあります。
- 関数ごとに 1 つのリース コンテナーを作成する: この方法では、共有スループット データベースを使用していない限り、追加のコストに変換できます。 コンテナー レベルでの最小スループットは 400 要求ユニットであり、リース コンテナーの場合は、進行状況のチェックポイント処理と状態の維持にのみ使用されることに注意してください。
- 1 つのリース コンテナーを用意し、すべての Functions で共有します。この 2 つ目のオプションでは、複数の Azure Functions が同じプロビジョニング済みスループットを共有して使用できるため、コンテナーにプロビジョニングされた要求ユニットをより適切に使用できます。
この記事の目的は、2 番目のオプションを実現するためのガイドです。
共有リース コンテナーの構成
共有リース コンテナーを構成するには、トリガーで行う必要がある唯一の追加構成は、C# を使用している場合は LeaseContainerPrefixattribute を追加するか、JavaScript を使用している場合は leaseContainerPrefixattribute を追加することです。 属性の値は、その特定のトリガーの論理記述子である必要があります。
たとえば、メールを送信するトリガー、具体化されたビューを作成するための集計を行うトリガー、別のストレージに変更を送信するトリガーの 3 つのトリガーがある場合は、後で分析するために、"emails" の LeaseContainerPrefix を最初のトリガーに割り当て、"具体化された" トリガーを 2 つ目に割り当て、3 つ目のトリガーに "分析" を割り当てることができます。
重要な部分は、3 つのトリガーすべてが 同じリース コンテナー構成 (アカウント、データベース、コンテナー名) を使用できることです。
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 の場合、function.json属性を使用して、leaseContainerPrefix ファイルに構成を適用できます。
{
"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 リポジトリ のサーバーレス レシピを参照してください。