Files d'attente de tâches en TypeScript : aperçu des bibliothèques et implémentation

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

Files d'attente de tâches pour TypeScript : aperçu des bibliothèques et implémentation pratique



Dans les applications web modernes en TypeScript, il est souvent nécessaire d'exécuter des opérations gourmandes en ressources de manière asynchrone, sans bloquer le thread principal. Pour cela, on utilise des files d'attente de tâches (job queues). Elles permettent de différer l'exécution, de répartir la charge et d'assurer un traitement fiable des processus en arrière-plan. Dans cet article, nous examinerons les meilleures bibliothèques pour travailler avec les files d'attente en TypeScript, leurs caractéristiques et des exemples d'utilisation.



Pourquoi des files d'attente de tâches ?

Imaginez que votre application doive envoyer 1000 e-mails, traiter des images ou effectuer des calculs complexes. Si cela est fait de manière synchrone, l'utilisateur attendra la réponse pendant des minutes. La file d'attente résout ce problème : vous placez la tâche dans une liste, et un worker la traite en arrière-plan. Principaux avantages :

  • Traitement asynchrone et non bloquant
  • Passage à l'échelle (plusieurs workers peuvent travailler en parallèle)
  • Résistance aux pannes (la tâche est redémarrée en cas d'erreur)
  • Planification (les tâches peuvent être différées à un moment précis)


Top des bibliothèques pour TypeScript

La plupart des solutions populaires sont construites sur Redis — une base de données in-memory rapide, idéale pour les files d'attente. Examinons trois options principales :



1. Bull (la plus populaire)

Bull est une bibliothèque mature et performante pour Node.js avec un support complet de TypeScript. Elle offre une API riche et des mécanismes intégrés de répétition, de délais et de priorités.

Installation :

npm install bullnpm install @types/bull

Exemple de création d'une file d'attente et d'un gestionnaire :

import Queue from 'bull';

// Création d'une file d'attente pour le traitement des envois d'e-mailsconst emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});

// Ajout d'une tâcheasync function sendWelcomeEmail(userId: string) { await emailQueue.add({ userId });}

// Gestionnaire (worker)emailQueue.process(async (job) => { const { userId } = job.data; // Logique d'envoi d'e-mail ici console.log(`Envoi d'e-mail à l'utilisateur ${userId}`); await sendEmail(userId);});

// Gestion des erreurs et tentatives de répétitionemailQueue.on('failed', (job, err) => { console.error(`Tâche ${job.id} échouée : ${err.message}`);});


2. Bee-Queue (alternative légère)

Bee-Queue est une file d'attente minimaliste, également basée sur Redis. Elle est plus simple que Bull, mais plus rapide pour les scénarios simples. Elle convient bien lorsque des configurations complexes ne sont pas nécessaires.

Installation :

npm install bee-queuenpm install @types/bee-queue

Exemple :

import Queue from 'bee-queue';

const imageQueue = new Queue('images', { redis: { host: 'localhost', port: 6379 }});

// Ajout d'une tâcheimageQueue.createJob({ imagePath: '/uploads/photo.jpg' }).save();

// TraitementimageQueue.process((job, done) => { const { imagePath } = job.data; // Traitement de l'image resizeImage(imagePath) .then(() => done()) .catch(done);});


3. RSMQ (sans worker séparé)

RSMQ (Redis Simple Message Queue) est une file d'attente basée sur Redis pur, qui ne nécessite pas de lancer un processus worker séparé. Les tâches sont traitées via un mécanisme de pull. Idéal pour une architecture de microservices.

Installation :

npm install rsmq

Exemple :

import RedisSMQ from 'rsmq';

const rsmq = new RedisSMQ({ host: 'localhost', port: 6379 });

// Création de la file d'attenteawait rsmq.createQueueAsync({ qname: 'tasks' });

// Envoi d'un messageawait rsmq.sendMessageAsync({ qname: 'tasks', message: '{"type":"process_payment"}' });

// Réception et traitement (en boucle)const message = await rsmq.receiveMessageAsync({ qname: 'tasks' });if (message.id) { console.log('Traitement :',

Recommendations