Delen via


Meerdere Azure Functions-triggers maken voor Azure Cosmos DB

VAN TOEPASSING OP: NoSQL

In dit artikel wordt beschreven hoe u meerdere Azure Functions-triggers voor Azure Cosmos DB kunt configureren om parallel te werken en onafhankelijk te reageren op wijzigingen.

Serverloze op gebeurtenissen gebaseerde functies die werken met de Azure Functions-trigger voor Azure Cosmos DB en het delen van een leasecontainer

Vereisten voor architectuur op basis van gebeurtenissen

Wanneer u serverloze architecturen bouwt met Azure Functions, is het raadzaam om kleine functiesets te maken die samenwerken in plaats van grote langlopende functies.

Wanneer u serverloze stromen op basis van gebeurtenissen bouwt met behulp van de Azure Functions-trigger voor Azure Cosmos DB, komt u in het scenario waarin u meerdere dingen wilt doen wanneer er een nieuwe gebeurtenis in een bepaalde Azure Cosmos DB-container is. Als acties die u wilt activeren, onafhankelijk zijn van elkaar, is de ideale oplossing om één Azure Functions-trigger te maken voor Azure Cosmos DB per actie die u wilt uitvoeren, waarbij allemaal wordt geluisterd naar wijzigingen in dezelfde Azure Cosmos DB-container.

Containers optimaliseren voor meerdere triggers

Gezien de vereisten van de Azure Functions-trigger voor Azure Cosmos DB, hebben we een tweede container nodig om de status op te slaan, ook wel de leasecontainer genoemd. Betekent dit dat u een afzonderlijke leasecontainer voor elke Azure-functie nodig hebt?

Hier hebt u twee opties:

  • Eén leasecontainer per functie maken: deze benadering kan worden omgezet in extra kosten, tenzij u een gedeelde doorvoerdatabase gebruikt. Houd er rekening mee dat de minimale doorvoer op containerniveau 400 aanvraageenheden is en in het geval van de leasecontainer wordt deze alleen gebruikt om de voortgang te controleren en de status te behouden.
  • Gebruik één leasecontainer en deel deze voor al uw functies: met deze tweede optie kunt u beter gebruikmaken van de ingerichte aanvraageenheden in de container, omdat meerdere Azure Functions dezelfde ingerichte doorvoer kunnen delen en gebruiken.

Het doel van dit artikel is om u te begeleiden bij het uitvoeren van de tweede optie.

Een container voor gedeelde leases configureren

Als u de container voor gedeelde leases wilt configureren, hoeft u alleen extra configuratie toe te voegen aan uw triggers door het LeaseContainerPrefix kenmerk toe te voegen als u C# of leaseContainerPrefix een kenmerk gebruikt als u JavaScript gebruikt. De waarde van het kenmerk moet een logische descriptor zijn van wat die specifieke trigger is.

Als u bijvoorbeeld drie triggers hebt: een trigger waarmee e-mailberichten worden verzonden, een die een aggregatie uitvoert om een gerealiseerde weergave te maken en een die de wijzigingen naar een andere opslag verzendt, kunt u voor latere analyse de LeaseContainerPrefix 'e-mailberichten' toewijzen aan de eerste, 'gerealiseerd' aan de tweede en 'analyse' aan de derde.

Het belangrijkste is dat alle drie de triggers dezelfde containerconfiguratie voor leases (account, database en containernaam) kunnen gebruiken.

Een zeer eenvoudige codevoorbeelden die gebruikmaken van het LeaseContainerPrefix kenmerk in C#, zien er als volgt uit:

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

En voor JavaScript kunt u de configuratie op het function.json bestand toepassen met het leaseContainerPrefix kenmerk:

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

Notitie

Controleer altijd op de aanvraageenheden die zijn ingericht in de container voor gedeelde leases. Elke trigger die deze deelt, verhoogt het gemiddelde verbruik van de doorvoer, dus mogelijk moet u de ingerichte doorvoer verhogen wanneer u het aantal Azure Functions verhoogt dat deze gebruikt.

Volgende stappen