Files d'attente de tâches pour TypeScript : guide complet sur Bull et Bee-Queue
Lors du développement d'applications web modernes en TypeScript, il est souvent nécessaire d'exécuter des opérations longues ou gourmandes en ressources de manière asynchrone, sans bloquer le thread principal. Par exemple : envoi de notifications par email, génération de rapports PDF, traitement d'images ou synchronisation avec des API externes. Pour résoudre ces problèmes, on utilise des files d'attente de tâches (job queues). Dans cet article, nous allons examiner en détail les deux bibliothèques les plus populaires pour TypeScript — Bull et Bee-Queue, et voir comment les intégrer dans votre projet.
Pourquoi des files d'attente de tâches ?
Une file d'attente de tâches permet :
- De séparer les responsabilités — le service principal se charge uniquement de placer la tâche, et le gestionnaire de l'exécuter.
- De gérer la charge — on peut limiter le nombre de tâches parallèles (concurrency).
- De garantir la livraison — les tâches ne sont pas perdues même en cas de panne du processus (grâce à Redis).
- De planifier l'exécution — différer une tâche à un moment précis ou la répéter selon un calendrier.
- De gérer les erreurs — tentatives automatiques (retry) avec délai exponentiel.
Bull — la file d'attente la plus populaire pour Node.js et TypeScript
Bull est une bibliothèque puissante basée sur Redis, prenant en charge un ensemble complet de fonctionnalités : priorités, tentatives, délais, pauses, événements et surveillance. Bull dispose d'une excellente typage pour TypeScript.
Installation et configuration
npm install bull @types/bullExemple simple d'une file d'attente pour l'envoi d'email :
import Queue from 'bull';
interface EmailJob { to: string; subject: string; body: string;}
// Création d'une file d'attente nommée 'email'const emailQueue = new Queue<EmailJob>('email', { redis: { host: 'localhost', port: 6379 }, defaultJobOptions: { attempts: 3, // jusqu'à 3 tentatives backoff: { type: 'exponential', delay: 2000 }, removeOnComplete: true, }});
// Gestionnaire — s'exécute en arrière-planemailQueue.process(async (job) => { console.log(`Envoi d'email à ${job.data.to}`); // Simulation d'envoi await new Promise(resolve => setTimeout(resolve, 1000)); console.log(`Email envoyé : ${job.data.subject}`);});
// Ajout d'une tâcheasync function addEmail() { await emailQueue.add({ to: 'user@example.com', subject: 'Bonjour depuis la file d\\'attente !', body: 'Ceci est un email de test.', });}
addEmail();Fonctionnalités avancées de Bull
- Tâches récurrentes (cron) :
queue.add(data, { repeat: { cron: '0 8 * * *' } }) - Priorités :
queue.add(data, { priority: 1 })— plus le nombre est petit, plus la priorité est élevée. - Délai d'exécution :
queue.add(data, { delay: 60000 })— différer d'une minute. - Événements : on peut s'abonner à
completed,failed,progresset autres. - Pause/reprise :
queue.pause()/queue.resume().
// Gestion des événementsemailQueue.on('completed', (job, result) => { console.log(`Tâche ${job.id} terminée`);});
emailQueue.on('failed', (job, err) => { console.error(`Tâche ${job.id} échouée : ${err.message}`);});Bee-Queue — une alternative légère
Bee-Queue est une file d'attente minimaliste basée sur Redis, plus simple et plus rapide que Bull en termes de consommation mémoire. Elle convient aux petits projets ou aux cas où des configurations complexes ne sont pas nécessaires.
Installation et exemple
npm install bee-queueimport Bee from 'bee Aussi dans la bibliothèque
Envoi de SMS en Go (Golang) : intégration avec l'API de la bibliothèque
Configuration des applications Go (Golang) : bibliothèques et outils
Configuration des applications Java : bibliothèques et outils pour la gestion des paramètres
Swagger-PHP pour PHP : guide complet avec exemples