Condividi tramite


Creare più trigger di Funzioni di Azure per Azure Cosmos DB

Questo articolo descrive come configurare più trigger di Funzioni di Azure affinché Azure Cosmos DB funzionino in parallelo e reagiscono in modo indipendente alle modifiche.

Funzioni serverless basate su eventi che operano con il trigger delle Funzioni di Azure per Azure Cosmos DB e condividono un contenitore di leasing

Requisiti dell'architettura basata su eventi

Quando si creano architetture serverless con Funzioni di Azure, è consigliabile creare set di funzioni di piccole dimensioni che interagiscono anziché funzioni a esecuzione prolungata di grandi dimensioni.

Quando si creano flussi serverless basati su eventi utilizzando il trigger di Azure Functions per Azure Cosmos DB, ci si troverà di fronte alla necessità di effettuare più operazioni ogni volta che si verifica un nuovo evento in un determinato contenitore di Azure Cosmos DB. Se le azioni che si vogliono attivare sono indipendenti l'una dall'altra, la soluzione ideale è creare un trigger di Funzioni di Azure per Azure Cosmos DB per ogni azione che si vuole eseguire, tutti in ascolto delle modifiche nello stesso contenitore di Azure Cosmos DB.

Ottimizzazione dei contenitori per più trigger

Considerati i requisiti del trigger di Azure Functions per Azure Cosmos DB, è necessario un secondo contenitore per archiviare lo stato, chiamato anche contenitore delle lease. Ciò significa che è necessario un contenitore di lease separato per ogni funzione di Azure?

In questo caso sono disponibili due opzioni:

  • Creare un container di leases per funzione: questo approccio può comportare costi aggiuntivi, a meno che non venga utilizzato un database con throughput condiviso. Tenere presente che la velocità effettiva minima a livello di contenitore è di 400 unità richiesta e, nel caso del contenitore di lease, viene usata solo per registrare lo stato di avanzamento e mantenere lo stato.
  • Avere un contenitore di lease e condividerli per tutte le funzioni: questa seconda opzione utilizza meglio le unità di richiesta sottoposte a provisioning nel contenitore, in quanto consente a più funzioni di Azure di condividere e utilizzare lo stesso throughput sottoposto a provisioning.

L'obiettivo di questo articolo è guidare l'utente a eseguire la seconda opzione.

Configurazione di un contenitore di locazioni condivise

Per configurare correttamente il contenitore di contratti di locazione condivisi, l'unica configurazione aggiuntiva che devi eseguire nei tuoi trigger consiste nell'aggiungere LeaseContainerPrefix se si utilizza C# oppure leaseContainerPrefix se si utilizza JavaScript. Il valore dell'attributo deve essere un descrittore logico del trigger specifico.

Ad esempio, se si dispone di tre trigger: uno che invia messaggi di posta elettronica, uno che esegue un'aggregazione per creare una visualizzazione materializzata e uno che invia le modifiche a un altro spazio di archiviazione, per un'analisi successiva, è possibile assegnare il LeaseContainerPrefix di "messaggi di posta elettronica" al primo, "materializzato" al secondo e "analisi" al terzo.

La parte importante è che tutti e tre i trigger possono usare la stessa configurazione del contenitore di lease (account, database e nome del contenitore).

Gli esempi di codice molto semplici che usano l'attributo LeaseContainerPrefix in C#, hanno un aspetto simile al seguente:

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

Per JavaScript è anche possibile applicare la configurazione nel function.json file con l'attributo 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"
}

Annotazioni

Monitorare sempre le Unità di richiesta di cui è stato effettuato il provisioning nel container di locazioni condivise. Ogni trigger che lo condivide aumenterà il consumo medio del throughput, quindi potrebbe essere necessario aumentare il throughput fornito con l'aumento del numero di Azure Functions che lo usano.

Passaggi successivi