Planifier des tâches avec azure service bus

François Hyvrier
Dec 21, 2018 · 4 min read

Initialement publié sur blog-tech.younited-credit.com le 11/06/2018.

Si jamais vous devez implémenter un système de planification de tâches, sachez que l’Azure Service Bus de Microsoft offre nativement une fonctionnalité de planification de messages sur laquelle on peut se baser pour déclencher des traitements différés. Nous avons nous-même utilisé ce mécanisme pour développer une application capable de planifier des envois de mails ou de SMS, et de les envoyer à la date et l’heure prévues.

Jusqu’alors, nous utilisions un système de planification développé en interne qui repose sur :

  • Une table de traitements dans une base de données SQL Server. Chaque ligne de la table « Traitement » contient les paramètres de la tâche à réaliser ainsi que la date et l’heure d’exécution souhaitées.

Cette solution fonctionne, mais elle présente quelques inconvénients :

  • Il s’agit d’un logiciel interne, et donc d’une application supplémentaire (avec son infrastructure) à développer, monitorer et maintenir.

Partant de ce constat, nous avons décidé de changer d’approche pour implémenter notre application d’envoi de mails et SMS, en nous appuyant sur la fonctionnalité de planification de messages de l’Azure Service Bus plutôt que sur notre système historique. Voici le principe général :

  • L’infrastructure nécessaire est une simple file de messages ou un topic d’un service bus.

Un exemple de code illustrant la planification d’un message :

Et à l’autre bout de la file, un exemple d’Azure Function déclenchée à chaque fois qu’un message devient disponible :

Les deux schémas ci-dessous illustrent la différence de fonctionnement des deux solutions. Dans le cas du système historique, c’est à l’application responsable d’envoyer les mails (le batch), d’aller chercher elle-même les informations dans une table SQL, les mails sont ensuite envoyés séquentiellement.

Solution historique utilisant une table SQL et un batch

Avec le nouveau système, les messages sont placés dans une file de messages avec une date de planification, le service bus les rendra disponible à ce moment-là, chaque message disponible déclenchera alors l’instanciation du consommateur qui enverra le mail correspondant. Si plusieurs instances du consommateur sont déployées, plusieurs messages disponibles en même temps dans la file seront traités en parallèle.

Nouvelle solution basée sur une file de messages

Cette architecture permet de régler de façon élégante les problèmes posés par notre solution historique :

  • Au niveau infrastructure, il n’est plus nécessaire de gérer une base de données et une table de traitements, une queue ou un topic de service bus suffisent à présent.

Nous avons utilisé l’Azure Service Bus pour planifier des messages, mais ce mécanisme est aussi disponible dans les files de type Azure Storage. Cependant il est plus restreint : les messages ne peuvent pas rester plus de 7 jours dans une file (Files d’attente Azure et files d’attente Service Bus : comparaison et différences).

YounitedTech

Le blog Tech de Younited, où l’on parle de développement, d’architecture, de microservices, de cloud, de data… Et de comment on s’organise pour faire tout ça. Ah, et on recrute aussi, on vous a dit ?

François Hyvrier

Written by

YounitedTech

Le blog Tech de Younited, où l’on parle de développement, d’architecture, de microservices, de cloud, de data… Et de comment on s’organise pour faire tout ça. Ah, et on recrute aussi, on vous a dit ?