Dela via


Skapa flera Azure Functions-utlösare för Azure Cosmos DB

GÄLLER FÖR: NoSQL

Den här artikeln beskriver hur du kan konfigurera flera Azure Functions-utlösare för Azure Cosmos DB så att de fungerar parallellt och självständigt reagerar på ändringar.

Serverlösa händelsebaserade funktioner som arbetar med Azure Functions-utlösaren för Azure Cosmos DB och delar en lånecontainer

Krav för händelsebaserad arkitektur

När du skapar serverlösa arkitekturer med Azure Functions rekommenderar vi att du skapar små funktionsuppsättningar som fungerar tillsammans i stället för stora tidskrävande funktioner.

När du skapar händelsebaserade serverlösa flöden med Hjälp av Azure Functions-utlösaren för Azure Cosmos DB får du se scenariot där du vill göra flera saker när det finns en ny händelse i en viss Azure Cosmos DB-container. Om åtgärder som du vill utlösa är oberoende av varandra, är den idealiska lösningen att skapa en Azure Functions-utlösare för Azure Cosmos DB per åtgärd som du vill göra, alla lyssnar efter ändringar i samma Azure Cosmos DB-container.

Optimera containrar för flera utlösare

Med tanke på kraven för Azure Functions-utlösaren för Azure Cosmos DB behöver vi en andra container för att lagra tillståndet, även kallat lånecontainern. Innebär det att du behöver en separat lånecontainer för varje Azure-funktion?

Här har du två alternativ:

  • Skapa en lånecontainer per funktion: Den här metoden kan leda till ytterligare kostnader, såvida du inte använder en databas med delat dataflöde. Kom ihåg att det minsta dataflödet på containernivå är 400 enheter för begäran, och när det gäller lånecontainern används det bara för att kontrollera förloppet och underhålla tillståndet.
  • Ha en lånecontainer och dela den för alla dina funktioner: Det här andra alternativet använder de etablerade enheter för begäranden på containern på ett bättre sätt, eftersom flera Azure Functions kan dela och använda samma etablerade dataflöde.

Målet med den här artikeln är att hjälpa dig att uppnå det andra alternativet.

Konfigurera en container för delade lån

För att konfigurera containern för delade lån är den enda extra konfiguration som du behöver göra på dina utlösare att lägga LeaseContainerPrefix till attributet om du använder C# eller leaseContainerPrefix attribut om du använder JavaScript. Värdet för attributet ska vara en logisk beskrivning av vad den specifika utlösaren har.

Om du till exempel har tre utlösare: en som skickar e-postmeddelanden, en som utför en aggregering för att skapa en materialiserad vy och en som skickar ändringarna till en annan lagringsplats, kan du för senare analys tilldela LeaseContainerPrefix "e-postmeddelanden" till den första, "materialiserad" till den andra och "analys" till den tredje.

Den viktiga delen är att alla tre utlösare kan använda samma containerkonfiguration för lån (konto, databas och containernamn).

Ett mycket enkelt kodexempel med LeaseContainerPrefix attributet i C#, skulle se ut så här:

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

Och för JavaScript kan du tillämpa konfigurationen function.json på filen med attributet 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"
}

Kommentar

Övervaka alltid på de enheter för begärandeenheter som har etablerats i containern för delade lån. Varje utlösare som delar den ökar den genomsnittliga dataflödesförbrukningen, så du kan behöva öka det etablerade dataflödet när du ökar antalet Azure Functions som använder det.

Nästa steg