Einleitung: Wozu braucht man Aufgabenwarteschlangen?
Stellen Sie sich vor, Sie betreiben einen Webserver mit Node.js. Ein Benutzer sendet eine Anfrage zum Versand von 1000 E-Mails. Wenn Sie diese Anfrage synchron verarbeiten, würde der Server für einige Minuten "einfrieren" – alle anderen Benutzer könnten keine Antwort erhalten.
Wie löst man dieses Problem? Die Antwort sind Aufgabenwarteschlangen (Task Queues). Sie ermöglichen es, ressourcenintensive Vorgänge (E-Mail-Versand, PDF-Generierung, Bildverarbeitung) zu verschieben und im Hintergrund auszuführen, ohne den Hauptthread der Anwendung zu blockieren.
In diesem Artikel behandeln wir:
- Was eine Aufgabenwarteschlange ist und wie sie funktioniert
- Beliebte Bibliotheken für Node.js (Bull, Kue)
- Codebeispiele: Erstellen, Hinzufügen und Verarbeiten von Aufgaben
- Best Practices für Anfänger
1. Grundlagen von Aufgabenwarteschlangen in Node.js
Was ist eine Aufgabenwarteschlange?
Eine Aufgabenwarteschlange ist eine Datenstruktur, die nach dem FIFO-Prinzip (First In, First Out – zuerst hinein, zuerst heraus) arbeitet. Aufgaben werden am Ende der Warteschlange hinzugefügt und vom Anfang aus verarbeitet. Üblicherweise basieren Warteschlangen auf Redis, einem schnellen Schlüssel-Wert-Speicher im Arbeitsspeicher.
Die Hauptkomponenten einer Warteschlange:
- Producer – der Code, der Aufgaben zur Warteschlange hinzufügt
- Consumer (Worker) – der Code, der Aufgaben abholt und ausführt
- Queue Manager – der Mechanismus, der die Warteschlange verwaltet (normalerweise Redis)
Beliebte Bibliotheken
Für Node.js gibt es zwei Hauptbibliotheken:
- Bull – modern, schnell, mit Unterstützung für Prioritäten, Wiederholungen und Verzögerungen
- Kue – eine ältere, aber einfache Bibliothek (derzeit weniger beliebt)
In diesem Artikel konzentrieren wir uns auf Bull, da es aktiv weiterentwickelt wird und mehr Funktionen bietet.
2. Installation und Einrichtung von Bull
Schritt 1: Redis installieren
Bull verwendet Redis. Wenn Sie Redis noch nicht haben, installieren Sie es:
# macOSbrew install redis
# Ubuntusudo apt-get install redis-server
# Redis startenredis-serverSchritt 2: Bull installieren
Erstellen Sie ein neues Projekt und installieren Sie das Paket:
mkdir queue-democd queue-demonpm init -ynpm install bullSchritt 3: Grundeinrichtung
Erstellen Sie eine Datei queue.js:
const Queue = require('bull');
// Erstellen einer Warteschlange mit dem Namen 'emailQueue'const emailQueue = new Queue('emailQueue', { redis: { host: '127.0.0.1', port: 6379 }});
module.exports = emailQueue;3. Beispiel: Warteschlange für den E-Mail-Versand
Schritt 1: Producer erstellen (Aufgaben hinzufügen)
Erstellen Sie eine Datei producer.js:
const emailQueue = require('./queue');
async function addEmailTask(to, subject, body) { // Aufgabe zur Warteschlange hinzufügen const job = await emailQueue.add({ to: to, subject: subject, body: body }, { // Aufgabenoptionen attempts: 3, // Anzahl der Versuche bei Fehlern backoff: 5000, // Verzögerung zwischen Versuchen (5 Sek.) delay: 1000 // Verzögerung vor der Ausführung (1 Sek.) });
console.log(`Aufgabe mit ID: ${job.id} hinzugefügt`); return job;}
// BeispielverwendungaddEmailTask('user@example.com', 'Hallo!', 'Testnachricht');Schritt 2: Worker erstellen (Aufgaben verarbeiten)
Erstellen Sie eine Datei worker.js:
const emailQueue = require('./queue');
// Funktion, die den E-Mail-Versand simuliertasync function sendEmail(to, subject, body) { console.log(`Sende E-Mail an ${to}...`); // Verzögerung simulieren await new Promise(resolve => setTimeout(resolve, 2000)); console.log(`E-Mail gesendet: ${subject}`);}
// Warteschlangen-Handler