Image mise en avant pour l'article

Les outils pour gérer une queue de traitement de tâches

28 avril 2021
Technologies Web - PHP - Symfony
Vous êtes développeur back-end ? Le système sur lequel vous travaillez vous oblige à traiter une multitude de tâches. Évidemment, les traiter toutes en même temps représenterait une charge immense pour le serveur. La solution : gérer une file d'attente ou queue de traitement !


Lorsque votre site web commence à nécessiter des traitements réguliers (par exemple, lorsqu’il doit récupérer ses contenus depuis une autre de vos applications), il est intéressant de ne pas gérer en une seule fois tous les traitements à effectuer en arrière-plan. Le concept de queue de traitement permet alors de limiter la charge de travail sur le serveur et de réduire les risques d’erreur dans un traitement.

Une queue de traitement permet de générer une liste de tâches à effectuer, les plus petites possibles, et de les faire traiter par le serveur en tâche de fond, sans intervention humaine.

Différents outils existent selon l’environnement de votre site pour gérer un système de queue de manière efficace. Nous allons lister quelques exemples.

Fonctionnement d'une queue de traitement

Lisez aussi notre article au sujet des erreurs à éviter lors de la création de tâches CRON.

 

Utiliser une table de queue dans une base de données

La création d’une table de queue pour vos éléments est la solution la plus simple. La création d'une table de queue n'a pour pré-requis qu’un élément généralement déjà en place sur les sites : une base de données sur la technologie de votre choix.

Créez une table pour stocker chaque entrée avec ses données. Faites une tâche CRON qui appelle une ligne, la traite puis la supprime, avant de passer à la suivante et vous avez un système fonctionnel !

 

Les possibilités d’améliorations

  • Ajoutez à la table un champ date de prise en compte. Lorsque votre processus veut traiter un item. Il met à jour ce champ avec la date courante. Ainsi, plusieurs processus peuvent cohabiter sans s’occuper du même élément. Déterminez une durée après laquelle l’élément est considéré comme “libéré”, la tâche ayant sûrement échoué si elle n’est pas terminée longtemps après ;
  • Ajoutez la notion de rejeu sur le script de traitement. Si votre tâche échoue à cause d’un appel externe raté par exemple, rejouer la tâche 2 ou 3 fois permet d’avoir moins de perte ;
  • Faites en sorte qu’un seul appel à votre script PHP consomme autant d’éléments qu’il est capable de le faire dans sa limite de temps d’exécution, afin de minimiser le nombre d’appels HTTP effectués avant la complétion de la liste à traiter.
 

 

Utiliser les outils fournis par votre CMS / Framework

Si vous travaillez sur un CMS ou un Framework, celui-ci fournit peut-être nativement un système de gestion de queue. En voici quelques exemples.

C’est le cas pour Drupal avec les méthodes de création d’éléments de queue et les QueueWorkers pour les consommer.

Ainsi, sur Drupal, vous avez nativement la possibilité de créer une queue (toutes les queues de traitement étant gérées par une table du CMS), ainsi que la possibilité de donner à Drupal les moyens de la consommer à chaque appel de ses tâches CRON.

Drupal est d'ailleurs l'un des rares CMS qui permet de gérer nativement ce système de file d'attente. Pour les autres CMS ou frameworks, l'utilisation d'applications dédiées ou de plugins est nécessaire, etc.

 

Les applications dédiées à la gestion de queue

Certaines applications sont créent dans le seul but de gérer de la manière la plus performante et la plus simple possible des queues de traitement.

rabbitmq_logo

C’est le cas par exemple de RabbitMQ qui nécessitera toutefois d’être installé sur un serveur pour fonctionner. Celui-ci va par exemple gérer la priorité des éléments avec des règles définies sur le serveur (traiter tel élément ou telle queue en premier), permettre de paralléliser sur un grand nombre de processus le traitement de la queue, sans donner un même élément à plusieurs processus, etc.

 

Les applications pouvant être utilisées pour gérer une queue de traitement

Certaines applications, bien que créées pour des besoins différents, peuvent tout à fait servir de gestionnaire de queue de traitement.

apache-kafka-logo

C’est par exemple le cas d’Apache Kafka qui va changer la façon dont on va gérer la queue : les éléments à traiter sont placés dans une queue permanente. Le processus qui consomme les éléments va avoir un pointeur sur cette queue et lire les éléments un à un, sans les supprimer.
Cette variante est intéressante dans le cas où plusieurs processus auront besoin de la même donnée à traiter.

Redis-Logo

Un autre cas de technologie détournée Redis. Initialement un système de base de données très rapide (car utilisant directement la mémoire vive de son serveur), il a évolué pour fournir un Message Broker (application permettant de gérer une queue de traitement, chaque élément étant un message). Celui-ci permet donc d’avoir des performances intéressantes sur la récupération des éléments à traiter si ceux-ci sont de petite taille.

Les files d'attente de tâches gèrent le travail qui doit être effectué en dehors du cycle habituel de requête/réponse HHTP en arrière-plan, de manière asynchrone. Le fait de déléguer des processus relativement longs à une tâche asynchrone permet notamment de réduire le temps d'affichage du site web. Il est également possible de définir le moment où le traitement de ces tâches lourdes doit être effectué pour éviter que le traitement de la queue soit réalisé lors des heures de charge du serveur.

Image mise en avant pour l'article
Jean-Pascal Langinier Linkedin
Développeur @ADIMEO
Ebook & Webinar
Choisissez la bonne technologie pour votre projet web !
Télécharger l'e-book
Vous maitrisez PHP & Symfony et vous souhaitez participer à une aventure humaine ?
Adimeo recrute un Développeur PHP / Symfony pour venir compléter son équipe.
Voir notre offre d'emploi !