Condividi tramite


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

SI APPLICA A: NoSQL

Questo articolo descrive come configurare più trigger di Funzioni di Azure per Azure Cosmos DB in modo da funzionare in parallelo e reagire in modo indipendente alle modifiche.

Funzioni basate su eventi serverless che utilizzano il trigger di Funzioni di Azure per Azure Cosmos DB e condividono un contenitore di lease

Requisiti dell'architettura basata su eventi

Durante la creazione di architetture serverless con Funzioni di Azure, si consiglia di creare piccoli set di funzioni che interagiscono tra loro invece di funzioni di grandi dimensioni a esecuzione prolungata.

Durante la creazione di flussi serverless basati su eventi usando il trigger Funzioni di Azure per Azure Cosmos DB, si presenterà certamente il caso in cui si devono eseguire più operazioni ogni volta che si verifica un nuovo evento in un particolare contenitore di Azure Cosmos DB. Se le azioni che si desidera attivare sono indipendenti l'una dall'altra, la soluzione ideale è quella di creare un trigger Funzioni di Azure per Azure Cosmos DB per ogni azione da eseguire, tutte in ascolto di modifiche nello stesso contenitore di Azure Cosmos DB.

Ottimizzazione di contenitori per più trigger

In base ai requisiti del trigger Funzioni di Azure per Azure Cosmos DB, è necessario un secondo contenitore per archiviare lo stato, noto anche come contenitore lease. Ciò significa che è necessario un contenitore per i lease separato per ogni funzione di Azure?

Sono disponibili due opzioni:

  • Creare un contenitore lease per funzione: questo approccio può comportare costi aggiuntivi, a meno che non si usi un database con velocità effettiva condivisa. Tenere presente che la velocità effettiva minima a livello di contenitore è di 400 Unità richiesta e, nel caso del contenitore per i lease, si usa solo per eseguire il checkpoint dello stato di avanzamento e mantenere lo stato.
  • Avere un contenitore lease e condividerlo per tutte le funzioni: questa seconda opzione semplifica l'uso delle Unità richiesta di cui è stato effettuato il provisioning nel contenitore, perché consente a più Funzioni di Azure di condividere e usare la stessa velocità effettiva con provisioning.

L'obiettivo di questo articolo è fornire istruzioni utili per usare la seconda opzione.

Configurazione di un contenitore per i lease condiviso

Per configurare il contenitore per i lease condiviso, la sola configurazione aggiuntiva necessaria da effettuare nei trigger consiste nell'aggiungere l'attributoLeaseContainerPrefixse si usa C# oppure l'attributoleaseContainerPrefix se si usa JavaScript. Il valore dell'attributo deve essere un descrittore logico di quale operazione esegue un trigger specifico.

Ad esempio, se si dispone di tre trigger: uno che invia messaggi e-mail, uno che esegue un'aggregazione per creare una vista materializzata e uno che invia le modifiche a un'altra risorsa di archiviazione per analisi successive, è possibile assegnare l'attributo LeaseContainerPrefix di "emails" al primo, di "materialized" al secondo e di "analytics" al terzo.

La cosa importante è che tutti e tre i trigger possona usare la stessa configurazione del contenitore per i lease (nome account, database e contenitore).

Un esempio di codice molto semplice che usa l'attributo LeaseContainerPrefix di C#, sarà 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)
{
    ...
}

E per JavaScript, è possibile applicare la configurazione al file function.json 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"
}

Nota

Monitorare sempre le Unità richiesta con provisioning del contenitore per i lease condiviso. Ogni trigger che lo condivide, aumenterà il consumo medio di velocità effettiva, pertanto potrebbe essere necessario aumentare la velocità effettiva con provisioning quando si aumenta il numero di Funzioni di Azure che lo utilizzano.

Passaggi successivi