Einleitung: Warum Ihr Server schläft, wenn er arbeiten sollte
\n\nStellen Sie sich vor: Ein Benutzer klickt auf die Schaltfläche „Bericht senden“ und die Seite friert für 30 Sekunden ein. Der Server generiert ein PDF, komprimiert Bilder und sendet eine E-Mail – alles synchron. Kommt Ihnen das bekannt vor? Wenn ja, sind Sie in die Falle des blockierenden Codes getappt.
\n\nIn diesem Artikel werden wir uns ansehen, wie Warteschlangen und Hintergrundaufgaben in TypeScript dieses Problem lösen. Sie erfahren, wie Sie schwere Arbeit in Hintergrundprozesse verlagern, ohne die Kontrolle über Fehler und Skalierbarkeit zu verlieren. Das Material richtet sich an Entwickler, die bereits mit Node.js vertraut sind und ihr Projekt auf die nächste Stufe heben möchten.
\n\nWir sprechen über die Bibliotheken Bull und BullMQ, streifen RabbitMQ und zeigen reale Codebeispiele in TypeScript. Los geht's!
Was ist eine Aufgabenwarteschlange und wozu braucht man sie?
\n\nEine Aufgabenwarteschlange (Task Queue) ist ein Mechanismus, der die Benutzeranfrage von ihrer Ausführung trennt. Anstatt die Operation direkt im HTTP-Handler zu verarbeiten, senden wir die Aufgabe an eine Warteschlange, und ein Hintergrund-Worker holt sie ab und führt sie asynchron aus.
\n\nTypische Anwendungsszenarien
\n- \n
- Versand von E-Mails und Push-Benachrichtigungen \n
- Generierung von PDFs, Bildern, Videos \n
- Datenparsing und Web-Scraping \n
- Bestellabwicklung in Online-Shops \n
- Massenberechnungen und Berichte \n
Ohne Warteschlangen riskiert Ihre Anwendung, unter Last zusammenzubrechen. Mit ihnen erhalten Sie Ausfallsicherheit (wenn ein Worker ausfällt, geht die Aufgabe nicht verloren) und Skalierbarkeit (Sie können 10 Worker statt einem ausführen).
\n\nBull und BullMQ: Leistungsstarke Warteschlangen für Node.js
\n\nBull ist die beliebteste Bibliothek für die Arbeit mit Warteschlangen im Node.js-Ökosystem. Sie basiert auf Redis und unterstützt TypeScript von Haus aus. BullMQ ist ihr Nachfolger, moderner, mit Unterstützung für Sandboxen (isolierte Prozesse) und erweitertem Management.
\n\nInstallation und grundlegende Einrichtung
\nnpm install bullmq ioredis\nnpm install -D @types/bull\n\nErstellen wir eine Warteschlange und einen Worker in TypeScript:
\n\n// queue.ts\nimport { Queue } from 'bullmq';\n\nconst connection = {\n host: 'localhost',\n port: 6379,\n};\n\nexport const emailQueue = new Queue('email', { connection });\n\n// worker.ts\nimport { Worker } from 'bullmq';\nimport { sendEmail } from './emailService';\n\nconst worker = new Worker('email', async job => {\n const { to, subject, body } = job.data;\n await sendEmail(to, subject, body);\n console.log(`E-Mail an ${to} gesendet`);\n}, { connection });\n\nworker.on('completed', job => {\n console.log(`Job ${job.id} abgeschlossen`);\n});\n\nworker.on('failed', (job, err) => {\n console.error(`Job ${job.id} fehlgeschlagen: ${err.message}`);\n});\n\nJetzt können wir von überall in der Anwendung eine Aufgabe hinzufügen:
\n\nimport { emailQueue } from './queue';\n\nawait emailQueue.add('send-welcome', {\n to: 'user@example.com',\n subject: 'Willkommen!',\n body: 'Vielen Dank für Ihre Registrierung...'\n});\n\nEinfach, oder? Aber das ist erst der Anfang. BullMQ bietet noch viel mehr Möglichkeiten.
\n\nErweiterte Funktionen von BullMQ
\n- \n
- Wiederholungsversuche – Wenn eine Aufgabe fehlschlägt, kann sie automatisch nach N Sekunden neu gestartet werden. \n
- Ausführungsverzögerung – Aufgabe für eine bestimmte Zeit verschieben. \n
- Prioritäten – Dringende Aufgaben werden zuerst verarbeitet. \n
- Ereignisse – Sie können auf Fortschritt, Abschluss, Fehler abonnieren. \n
- Sandboxen – Codeausführung in einem isolierten Prozess (Sicherheit + Sauberkeit). \n
Beispiel mit Wiederholungen und Verzögerung:
\n\nawait emailQueue.add('send-invoice', {\n invoiceId: 123,\n email: 'client@example.com'\n}, {\n attempts: 5,\n backoff: { type: 'expon