Aufgabenwarteschlangen in TypeScript: Überblick über Bibliotheken und Implementierung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Aufgabenwarteschlangen für TypeScript: Überblick über Bibliotheken und praktische Implementierung



In modernen Webanwendungen mit TypeScript besteht häufig die Notwendigkeit, rechenintensive Operationen asynchron auszuführen, ohne den Hauptthread zu blockieren. Dazu werden Aufgabenwarteschlangen (job queues) verwendet. Sie ermöglichen es, die Ausführung zu verschieben, die Last zu verteilen und eine zuverlässige Verarbeitung von Hintergrundprozessen sicherzustellen. In diesem Artikel betrachten wir die besten Bibliotheken für die Arbeit mit Warteschlangen in TypeScript, ihre Besonderheiten und Anwendungsbeispiele.



Wozu braucht man Aufgabenwarteschlangen?

Stellen Sie sich vor, Ihre Anwendung muss 1000 E-Mails versenden, Bilder verarbeiten oder komplexe Berechnungen durchführen. Wenn dies synchron geschieht, wartet der Benutzer minutenlang auf eine Antwort. Eine Warteschlange löst dieses Problem: Sie fügen eine Aufgabe in eine Liste ein, und ein Worker verarbeitet sie im Hintergrund. Die wichtigsten Vorteile:

  • Asynchronität und nicht-blockierende Verarbeitung
  • Skalierbarkeit (mehrere Worker können parallel arbeiten)
  • Ausfallsicherheit (Aufgabe wird bei Fehler neu gestartet)
  • Planung (Aufgaben können für eine bestimmte Zeit zurückgestellt werden)


Top-Bibliotheken für TypeScript

Die meisten gängigen Lösungen basieren auf Redis – einer schnellen In-Memory-Datenbank, die sich ideal für Warteschlangen eignet. Wir betrachten drei Hauptoptionen:



1. Bull (die beliebteste)

Bull ist eine ausgereifte und leistungsstarke Bibliothek für Node.js mit vollständiger TypeScript-Unterstützung. Sie bietet eine umfangreiche API und integrierte Mechanismen für Wiederholungen, Verzögerungen und Prioritäten.

Installation:

npm install bullnpm install @types/bull

Beispiel für die Erstellung einer Warteschlange und eines Handlers:

import Queue from 'bull';

// Erstellen einer Warteschlange für die Verarbeitung von E-Mail-Kampagnenconst emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});

// Hinzufügen einer Aufgabeasync function sendWelcomeEmail(userId: string) { await emailQueue.add({ userId });}

// Handler (Worker)emailQueue.process(async (job) => { const { userId } = job.data; // Hier die Logik zum Senden der E-Mail console.log(`Sende E-Mail an Benutzer ${userId}`); await sendEmail(userId);});

// Fehlerbehandlung und WiederholungsversucheemailQueue.on('failed', (job, err) => { console.error(`Job ${job.id} fehlgeschlagen: ${err.message}`);});


2. Bee-Queue (leichte Alternative)

Bee-Queue ist eine minimalistische Warteschlange, die ebenfalls auf Redis basiert. Sie ist einfacher als Bull, aber für einfache Szenarien schneller. Gut geeignet, wenn keine komplexen Einstellungen erforderlich sind.

Installation:

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

Beispiel:

import Queue from 'bee-queue';

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

// Aufgabe hinzufügenimageQueue.createJob({ imagePath: '/uploads/photo.jpg' }).save();

// VerarbeitungimageQueue.process((job, done) => { const { imagePath } = job.data; // Bildverarbeitung resizeImage(imagePath) .then(() => done()) .catch(done);});


3. RSMQ (ohne separaten Worker)

RSMQ (Redis Simple Message Queue) ist eine Warteschlange auf Basis von reinem Redis, die keinen separaten Worker-Prozess erfordert. Aufgaben werden über einen Pull-Mechanismus verarbeitet. Ideal für eine Microservice-Architektur.

Installation:

npm install rsmq

Beispiel:

import RedisSMQ from 'rsmq';

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

// Warteschlange erstellenawait rsmq.createQueueAsync({ qname: 'tasks' });

// Nachricht sendenawait rsmq.sendMessageAsync({ qname: 'tasks', message: '{"type":"process_payment"}' });

// Nachricht empfangen und verarbeiten (in einer Schleife)const message = await rsmq.receiveMessageAsync({ qname: 'tasks' });if (message.id) { console.log('Verarbeite:',

Empfehlungen