Partager via


Créer plusieurs déclencheurs Azure Functions pour Azure Cosmos DB

S’APPLIQUE À : NoSQL

Cet article explique comment configurer plusieurs déclencheurs Azure Functions pour Azure Cosmos DB fonctionnant en parallèle et réagissant de façon indépendante aux modifications.

Fonctions basées sur les événements serverless fonctionnant avec le déclencheur Azure Functions pour Azure Cosmos DB et partageant un conteneur de baux

Exigences de l’architecture basée sur les événements

Quand il s’agit de créer des architectures serverless avec Azure Functions, il est recommandé de créer un ensemble de petites fonctions qui fonctionnent bien ensemble plutôt que des fonctions volumineuses et durables.

À mesure que vous créerez des flux serverless basés sur les événements à l’aide du déclencheur Azure Functions pour Azure Cosmos DB, le cas se présentera où vous voudrez faire plusieurs choses chaque fois qu’un nouvel événement se produit dans un conteneur Azure Cosmos DB déterminé. Si les actions que vous souhaitez déclencher sont indépendantes les unes des autres, la solution idéale consiste à créer un déclencheur Azure Functions pour Azure Cosmos DB par action, chacun étant à l’écoute des modifications se produisant dans le même conteneur Azure Cosmos DB.

Optimisation des conteneurs pour plusieurs déclencheurs

Compte tenu des exigences du déclencheur Azure Functions pour Azure Cosmos DB, nous avons besoin d’un second conteneur pour stocker l’état, également appelé conteneur de baux. Cela veut-il dire que vous avez besoin d’un conteneur de baux distinct pour chaque fonction Azure ?

Ici, vous avez le choix entre deux options :

  • Créer un conteneur de baux par fonction : cette approche peut entraîner des coûts supplémentaires, à moins que vous utilisiez une base de données à débit partagé. Ne perdez pas de vue que le débit minimal au niveau du conteneur est de 400 unités de requête, et dans le cas du conteneur de baux, il sert uniquement à vérifier la progression et à maintenir l’état.
  • Prévoir un conteneur de baux et le partager pour toutes vos fonctions : cette deuxième option fait un meilleur usage des unités de requête provisionnées dans le conteneur, car elle permet à plusieurs fonctions Azure de partager et d’utiliser le même débit provisionné.

Le but de cet article est de vous guider jusqu’à parvenir à la deuxième option.

Configuration d’un conteneur de baux partagé

Pour configurer le conteneur de baux partagé, la seule tâche de configuration supplémentaire que vous devez effectuer au niveau de vos déclencheurs consiste à ajouter l’attributLeaseContainerPrefix si vous utilisez C# ou l’attributleaseContainerPrefix si vous utilisez JavaScript. La valeur de l’attribut doit être un descripteur logique de l’action effectuée par le déclencheur en question.

Par exemple, supposez que vous disposez de trois déclencheurs : un qui envoie des e-mails, un qui effectue une agrégation pour créer une vue matérialisée et un autre qui envoie les modifications à un autre espace de stockage pour une analyse ultérieure. Vous pouvez affecter à l’attribut LeaseContainerPrefix la valeur « e-mails » au premier, « matérialisé » au deuxième et « analytique » au troisième.

Le point essentiel est que les trois déclencheurs puissent utiliser la même configuration de conteneur de baux (compte, base de données et nom de conteneur).

Voici un exemple de code très simple avec l’attribut LeaseContainerPrefix en C# :

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

Et pour JavaScript, vous pouvez appliquer la configuration au fichier function.json avec l’attribut 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"
}

Notes

Surveillez toujours les unités de requête provisionnées dans votre conteneur de baux partagé. Sachant que chaque déclencheur qui le partage augmentera la consommation moyenne de débit, vous serez peut-être amené à augmenter le débit provisionné à mesure qu’augmentera le nombre de fonctions Azure qui l’utilisent.

Étapes suivantes