Files d'attente de tâches en JavaScript (Node.js) : guide complet pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi les files d'attente de tâches en JavaScript sont-elles nécessaires ?

\n

Dans le développement web moderne, les applications sont souvent confrontées à des tâches qui ne peuvent pas être exécutées instantanément dans le cadre d'une seule requête HTTP. L'envoi d'e-mails, le traitement d'images, la génération de rapports PDF ou la synchronisation avec des API externes — tout cela prend du temps et peut "figer" le serveur s'il est exécuté de manière synchrone.

\n

Les files d'attente de tâches (Task Queues) résolvent ce problème. Elles permettent de différer l'exécution d'opérations gourmandes en ressources et de les traiter de manière asynchrone en arrière-plan. Dans cet article, nous allons voir comment créer et gérer des files d'attente de tâches dans l'environnement Node.js, en utilisant des bibliothèques populaires.

\n\n

1. Principes de base du travail avec les files d'attente dans Node.js

\n

Une file d'attente de tâches est une structure de données fonctionnant selon le principe FIFO (First In, First Out). Les tâches sont ajoutées à la fin de la file d'attente et traitées depuis le début. Dans le contexte de Node.js, cela signifie que votre serveur peut répondre rapidement à l'utilisateur ("Tâche prise en charge"), tandis que la tâche elle-même sera exécutée plus tard.

\n

Pour travailler avec les files d'attente dans Node.js, on utilise des bibliothèques spécialisées qui s'appuient sur des stockages externes (le plus souvent Redis). Examinons les deux plus populaires :

\n
    \n
  • Bull — une bibliothèque moderne, rapide et stable basée sur Redis.
  • \n
  • Kue — une bibliothèque plus ancienne mais toujours populaire avec une interface web intégrée.
  • \n
\n

Nous nous concentrerons sur Bull, car elle est devenue le standard de facto pour les nouveaux projets.

\n\n

1.1 Installation et connexion de Bull

\n

Pour commencer, installez les dépendances nécessaires :

\n
npm install bull ioredis
\n

Créons maintenant une file d'attente simple :

\n
const Queue = require('bull');\nconst myQueue = new Queue('emailQueue', {\n  redis: {\n    host: '127.0.0.1',\n    port: 6379\n  }\n});\n\n// Ajouter une tâche à la file d'attente\nmyQueue.add({\n  to: 'user@example.com',\n  subject: 'E-mail de bienvenue',\n  body: 'Bienvenue sur notre site !'\n});\n\nconsole.log('Tâche ajoutée à la file d'attente');
\n

Dans cet exemple, nous avons créé une file d'attente nommée emailQueue et y avons ajouté une tâche — l'envoi d'un e-mail. La tâche n'est pas encore exécutée, elle attend simplement son gestionnaire.

\n\n

2. Traitement des tâches de la file d'attente

\n

Pour que les tâches commencent à être exécutées, nous avons besoin d'un gestionnaire (consumer). Il va "écouter" la file d'attente et en retirer les tâches à exécuter.

\n

Créons un fichier worker.js :

\n
const Queue = require('bull');\nconst emailQueue = new Queue('emailQueue', {\n  redis: { host: '127.0.0.1', port: 6379 }\n});\n\n// Fonction gestionnaire\nemailQueue.process(async (job) => {\n  const { to, subject, body } = job.data;\n  console.log(`Envoi de l'e-mail à ${to}...`);\n  \n  // Simulation d'envoi d'e-mail (dans un projet réel, ce serait nodemailer)\n  await new Promise(resolve => setTimeout(resolve, 2000));\n  \n  console.log(`E-mail "${subject}" envoyé à ${to}`);\n  return { status: 'sent', email: to };\n});\n\nconsole.log('Gestionnaire démarré et en attente de tâches...');
\n

Exécutez ce script, puis ajoutez une tâche à partir du premier exemple. Vous verrez la tâche être traitée.

\n\n

2.1 Gestion des erreurs et tentatives de reprise

\n

Dans les projets réels, les tâches peuvent échouer (par exemple, serveur SMTP indisponible). Bull fournit un mécanisme intégré de tentatives de reprise :

\n
emailQueue.add(\n  { to: 'user@example.com', subject: 'E-mail important' },\n  { \n    attempts: 5,          // Nombre de tentatives\n    backoff: { type: 'exponential', delay: 2000 } // Délai exponentiel\n  }\n);\n\n// Dans le gestionnaire, on peut gérer l'échec\nemailQueue.on('failed', (job, err) => {\n  console.error(`Tâche ${job.id} a échoué : ${err.message}`);\n});
\n\n

3. Fonctionnalités avancées des files d'attente

\n

Bull offre de nombreuses fonctions utiles pour la gestion des tâches.

\n\n

3.1 Priorités des tâches

Blogs

Book Recommendations