Obtenir le nombre de messages dans une Azure Queue
Les queues proposées par le service Azure Storage Account (plus connues sous le nom d’Azure Storage Queues) est un mécanisme pratique et peu coûteux de placer des requêtes de traitement en file d’attente afin qu’elles soient traitées dès qu’un agent est disponible.
Les Azure Storage Queues sont une des constituantes du service Azure Storage Account :
Les files d’attente : en quoi est-ce utile ?
Lorsque tu commandes un article sur un site marchand (ex. Amazon), lorsque tu cliques sur le bouton « Confirmer ma commande », il serait impensable que tu sois obligé d’attendre devant ton écran que ta commande soit traitée et expédiée avant d’avoir une confirmation…
Les files d’attentes sont là pour ça justement. Le site marchand va te dire que ta commande a bien été reçue et qu’elle sera traitée dans les meilleurs délais et te fournit un numéro de confirmation de commande.
Une fois ces étapes complétées, un message de demande de traitement de ta commande est placé dans une file d’attente et sera traité ultérieurement. Tu peux donc vaquer à tes occupations (continuer à naviguer sur le site, aller sur un autre site, prendre un café, faire dodo, ou autre…) sans te soucier de quand sera traitée ta commande.
Schématiquement, ça ressemble à ceci :
Le site web du marchand dans ce cas est ce qu’on pourrait appeler un « fournisseur de traitement » et les systèmes internes de ce marchand sont ce qu’on pourrait appeler des « agents de traitement » : ils consomment les messages présents dans la Queue et les traitent.
Dans l’exemple du site marchand, un des systèmes internes pourrait t’envoyer un courriel lorsque ta commande a été expédiée.
Azure Storage Queues vs d’autres mécanismes de files d’attente
Il existe d’autres mécanismes de Queuing, dans Azure et hors d’Azure, tels que les Azure Service Bus Queues ou encore RabbitMQ.
Chacun a ses forces et ses faiblesses… ainsi qu’un coût plus ou moins élevé.
Pour une analyse détaillée comparant les Azure Storage Queues et les Azure Service Bus Queues, consultes cet article.
Avec quel langage puis-je utiliser les Azure Storage Queues ?
Tous les services d’Azure sont accessibles via des appels à une API RESTFul. Tu peux donc soit être hardcore et écrire tes appels toi-même ou encore (no shame) utiliser un des SDK fourni pour ton langage favori qui abstrait ces appels via des classes et des méthodes prévues à cet effet.
Il en existe pour un tas de langages : Go, Python, .NET, Java, NodeJS, Ruby, PHP, Swift, etc.
Michael Yeaney, dans son article de blog, te montre même comment communiquer avec les Azure Storage Queues en PowerShell !
Quelques cas d’utilisation des Azure Storage Queues
J’ai déjà mentionné le cas où, dans le temps, on plaçait des Azure Storage Queues entre des Web Roles et des Worker Roles pour déléguer du traitement à des agents de manière différée et asynchrone.
Plus récemment, ces mêmes Queues peuvent servir de triggers pour des Azure WebJobs ou des Azure Functions. Ainsi, un traitement est déclenché dès lors qu’un nouveau message est ajouté dans une Queue.
Aussi, rien ne t’empêche d’utiliser les Azure Storage Queues dans un contexte de communication entre une application on-premises et une application dans Azure !
Pourquoi n’est-il pas possible de connaitre précisément le nombre d’éléments dans la file d’attente
Tout simplement car une même Queue peut être accédée par plusieurs agents de traitement et plusieurs fournisseurs de traitement.
De ce fait, lorsque tu demandes le nombre d’éléments dans la Queue à un instant donné, il se peut qu’un agent ait pris en charge le traitement d’un message et/ou qu’un fournisseur ait ajouter un nouveau message à la Queue.
C’est pourquoi, il n’y a pas de propriété « Count » ou « Length » sur une Queue.
Obtenir une approximation du nombre d’éléments dans la file d’attente
Pour l’exemple, nous allons créer une Azure Queue et y insérer quelques messages. Par souci de simplicité, nous allons faire cela directement dans le Portail d’Azure.
Nous allons ensuite écrire une petite application console qui nous affiche une approximation du nombre d’éléments dans cette Queue. Cette application est écrite en .NET Core 2.1 car je suis sous macOS. Mais ça fonctionne aussi bien en .NET Framework.
Je n’entrerai pas dans le détail de comment créer l’application, ajouter les packages NuGet « WindowsAzure.Storage » et « Microsoft.WindowsAzure.ConfigurationManager » et configurer le projet avec les clé de configuration etc. Je ne me concentrerai que sur l’approximation du nombre de messages dans la Queue.
Je rends toutefois disponible le code sur mon GitHub à l’adresse suivante.
La partie la plus intéressante est celle-ci :
// Instancier le queue client. CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient(); // Obtenir une référence à la Queue. CloudQueue queue = queueClient.GetQueueReference("getcount"); // Obtenir les attributs de la Queue. await queue.FetchAttributesAsync(); // Obtenir le nombre approximatif de messages. int? cachedMessageCount = queue.ApproximateMessageCount;
Si tu regardes le code, on obtient ce nombre encore une fois suite à la suppression de quelques messages de la Queue (via le bouton « Dequeue message » du Portail Azure), et sans avoir préalablement réobtenu les attributs de celle-ci. On constate que le nombre n’a pas changé.
Toutefois, on obtient le bon nombre de messages lorsque on réobtient les attributs de la Queue avant d’obtenir une approximation du nombre de messages.
Toute l’astuce est là : il faut penser à obtenir les attributs de la Queue avant d’en demander le nombre (approximatif) de messages.
L’approximation est justement due à ce fait : le nombre de messages a pu changer entre le moment où on a obtenu les attributs de la Queue et le moment où l’on a affiché le nombre de messages !
Voici ce que donne l’exécution de ce code :
Pourquoi est-ce si important d’estimer le nombre de messages dans la Queue ?
Comme tu le sais probablement déjà, la plupart des services sur Azure (et sur tous les fournisseurs de Cloud en général) sont facturés à l’utilisation.
En connaissant le nombre de messages à traiter dans la Queue (ou en en ayant une bonne approximation), on peut choisir le nombre d’agents de traitement de manière plus précise et ainsi optimiser les coûts.
Avec des stratégies d’auto-scaling, il est même possible de définir des règles pour augmenter ou diminuer le nombre de ces agents en fonction du nombre de messages dans la Queues et ce, de manière automatique.
En conclusion…
Les Azure Storage Queues s’avèrent très intéressantes pour des besoins de file d’attente de base. Elles sont certes moins évoluées que les Azure Service Bus Queues par exemple mais aussi moins onéreuses et très pratiques si leurs particularités (et limitations) ne sont pas un frein à ton besoin et si tu sais articuler ta solution autour de ces limitations et particularités.
Alors, la prochaine fois que tu auras besoin d’un mécanisme de Queuing, penses aux Azure Storage Queues.
À la prochaine !