Azure Functions est le principal service du Cloud de Microsoft qui vous permet de créer des architectures serverless. Il est particulièrement adapté aux scénarios d’intégration. Le service hébergé fournit des outils pratiques pour effectuer des traitements, en se basant sur des triggers (ou déclencheurs). Ainsi, vous avez la possibilité d’écrire du code qui se déroule automatiquement suite à un événement tel que la présence d’un blob dans Azure Blob Storage, ou une suite à une requête http. Exemple de scénario simple : on récupère un fichier déposé sur le service de stockage, on y exécute des transformations puis on insère des données en base.

comment Limiter et contrôler le nombre d’opérations déclenchées dans une Azure Function

Comment limiter et contrôler le nombre d’opérations déclenchées dans une Azure Function

L’une des problématiques que vous pourrez alors rencontrer est la maîtrise du flux entrant. Plusieurs fichiers peuvent être créés en même temps, ce qui déclenche votre processus d’intégration en parallèle. Ces multiples opérations peuvent surcharger le service cible, comme la base de données ou une API tiers. Pour empêcher ce comportement, vous pouvez limiter le nombre d’événements déclenchés. Comment mieux maîtriser ces opérations, alors que vous n’avez pas la main sur l’événement déclencheur ? Une solution fréquemment employée dans le domaine de l’intégration est le découplage.

Pour implémenter ma solution, j’ai utilisé une file d’attente Azure Storage Queue, afin d’isoler le traitement « non maitrisé », qui est l’apparition de fichiers sur Azure Storage. J’aurais pu également utiliser d’autres solutions pour jouer le rôle d’intermédiaire de tampon. Deux avantages dans l’utilisation d’Azure Queue :

  • La possibilité de limiter le nombre de traitements sur la file d’attente via une configuration sur Azure Functions,
  • Le rejeu pour déclencher facilement votre processus, en insérant des messages dans votre file d’attente.

En limitant le nombre d’opérations sur Azure Queue, j’évite ainsi de surcharger la base de données cible. L’optimisation donne lieu à l’organisation suivante.

comment Limiter et contrôler le nombre d’opérations déclenchées dans une Azure Function

Vous pouvez observer deux Azure Functions, la seconde se déclenchant à la présence d’un message dans la file d’attente d’Azure Storage Queue. Afin de faire le lien avec le blob dans Azure Storage, nous pouvons transmettre le chemin complet du fichier. A partir du chemin, je peux récupérer le flux de données source et réaliser les opérations de transformation et d’insertion initialement prévues.

Voici un exemple de code pour réaliser cette opération :

public static async Task Run(string path, TraceWriter log)
{
	string storageConnectionString = ConfigurationManager.AppSettings["StorageAccount.ConnectionString"];

	log.Info($"Executing {typeof(QueueTriggerFunction).Name} on file {path}");

	CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);
	CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
	CloudBlobContainer container = blobClient.GetContainerReference("data");
	await container.CreateIfNotExistsAsync();

	CloudBlockBlob blockBlob = container.GetBlockBlobReference(path);

	using (var memoryStream = new MemoryStream())
	{
		blockBlob.DownloadToStream(memoryStream);
		memoryStream.Position = 0;
		//Proceed with stream
	}
}

 

Avec cette nouvelle configuration, vous pouvez spécifier le nombre d’instances de votre Azure Function. Pour se faire, il suffit de manipuler le fichier host.json présent dans le dossier racine de votre fonction Azure. Le paramètre batchSize correspond au nombre de messages dans la file d’attente que vous voulez traiter en parallèle. Vous pouvez définir cette limite pour éviter de surcharger vos ressources cibles.

Vous pouvez obtenir davantage de détails sur les paramètres de ce fichier via le lien suivant.

https://docs.microsoft.com/fr-fr/azure/azure-functions/functions-host-json

Pour terminer, pour rejouer une opération, vous pouvez passer par l’utilitaire Azure Storage Explorer. Il est alors très pratique d’insérer des messages directement dans la file d’attente.

comment Limiter et contrôler le nombre d’opérations déclenchées dans une Azure Function

A noter que pour l’instant, il s’agit d’un paramétrage par instance. Si vous choisissez de déployer vos fonctions sur votre App Service Plan, le nombre d’instances utilisées influe sur l’ingestion des messages de votre file d’attente. Néanmoins, Azure Functions est un service qui bénéficie dernièrement de nombreuses évolutions, afin de participer à l’intégration du serverless dans vos solutions. L’extension Durable Functions, actuellement en Preview, fournira de nouvelles options pour opérer et gérer vos instances de fonctions.

 

livre blanc From Zero to Hero 2 réseau azure