Freigeben über


Erstellen mehrerer Azure Functions-Trigger für Azure Cosmos DB

GILT FÜR: NoSQL

Dieser Artikel beschreibt, wie Sie mehrere Azure Functions-Trigger für Azure Cosmos DB konfigurieren können, die parallel verwendet werden können und unabhängig voneinander auf Änderungen reagieren.

Serverlose ereignisbasierte Funktionen, die mit dem Azure Functions-Trigger für Azure Cosmos DB arbeiten und gemeinsam einen Leasecontainer nutzen

Anforderungen an die ereignisbasierte Architektur

Beim Erstellen serverloser Architekturen mit Azure Functions gilt die Empfehlung, kleine zusammenarbeitende Funktionsgruppen anstelle umfangreicher, zeitintensiver Funktionen zu erstellen.

Wenn Sie ereignisbasierte serverlose Flows mithilfe des Azure Functions-Triggers für Azure Cosmos DB erstellen, entsteht ein Szenario, in dem Sie immer dann mehrere Aktionen ausführen möchten, wenn in einem bestimmten Azure Cosmos DB-Container ein neues Ereignis auftritt. Wenn auszulösende Aktionen voneinander unabhängig sind, wäre die ideale Lösung, pro auszuführende Aktion einen Azure Functions-Trigger für Azure Cosmos DB zu erstellen, wobei alle Trigger in demselben Azure Cosmos DB-Container auf Änderungen lauschen.

Optimieren von Containern für mehrere Trigger

Unter Berücksichtigung der Anforderungen des Azure Functions-Triggers für Azure Cosmos DB benötigen wir einen zweiten Container zum Speichern des Status, auch als Leasecontainer bezeichnet. Bedeutet das nun, dass Sie für jede Azure-Funktion einen separaten Leasescontainer benötigen?

Hier haben Sie zwei Möglichkeiten:

  • Sie erstellen einen Leasescontainer pro Funktion: Dieser Ansatz kann zusätzliche Kosten nach sich ziehen, es sei denn, Sie verwenden eine Datenbank mit gemeinsam genutztem Durchsatz. Beachten Sie, dass der minimale Durchsatz auf Containerebene 400 Anforderungseinheiten beträgt, und bei den Leasescontainern wird er nur verwendet, um den Fortschritt zu prüfen und den Zustand beizubehalten.
  • Sie verwenden einen Leasescontainer und nutzen ihn gemeinsam für alle Ihre Funktionen: Diese zweite Option nutzt die für den Container bereitgestellten Anforderungseinheiten besser, da sie mehreren Azure-Funktionen ermöglicht, denselben bereitgestellten Durchsatz gemeinsam zu verwenden.

Dieser Artikel soll Sie durch die Realisierung der zweiten Option führen.

Konfigurieren eines gemeinsam genutzten Leasescontainers

Um den gemeinsam genutzten Leasescontainer zu konfigurieren, müssen Sie Ihren Triggern nur das LeaseContainerPrefix-Attribut hinzufügen, wenn Sie C# verwenden, oder das leaseContainerPrefix-Attribut bei Verwendung von JavaScript. Der Wert des Attributs sollte ein logischer Deskriptor der Funktion des jeweiligen Triggers sein.

Angenommen, Sie haben drei Trigger: einen, der E-Mails sendet, einen, der eine Aggregation zum Erstellen einer materialisierten Sicht durchführt, und einen, der die Änderungen für eine spätere Analyse an einen anderen Speicher sendet. Sie könnten dann das LeaseContainerPrefix „emails“ dem ersten zuweisen, „materialized“ dem zweiten und „analytics“ dem dritten.

Das Entscheidende ist, dass alle drei Trigger dieselbe Leasescontainerkonfiguration verwenden können (Konto, Datenbank und Containername).

Ein sehr einfaches Codebeispiel mit dem LeaseContainerPrefix-Attribut in C# sieht wie folgt aus:

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)
{
    ...
}

Für JavaScript können Sie die Konfiguration mit dem leaseContainerPrefix-Attribut auf die function.json-Datei anwenden:

{
    "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"
}

Hinweis

Überwachen Sie immer die auf Ihrem gemeinsam genutzten Leasescontainer bereitgestellten Anforderungseinheiten. Da jeder Trigger, der ihn nutzt, die durchschnittliche Durchsatznutzung erhöht, müssen Sie möglicherweise den bereitgestellten Durchsatz erhöhen, wenn Sie die Anzahl der Azure-Funktionen erhöhen, die ihn verwenden.

Nächste Schritte

  • Hier finden Sie Informationen zur vollständigen Konfiguration des Azure Functions-Triggers für Azure Cosmos DB.
  • Ziehen Sie die erweiterte Liste von Beispielen für alle Sprachen zu Rate.
  • Im GitHub-Repository finden Sie weitere Beispiele mit „serverlosen“ Anleitungen für Azure Cosmos DB und Azure Functions.