Rate Limiting in TypeScript: Bibliotheken, Strategien und Beispiele

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

Rate Limiting in TypeScript: Vollständiger Leitfaden zu Bibliotheken und Implementierung

\n\n

Rate Limiting (Begrenzung der Anfragenrate) ist ein Mechanismus zur Verkehrskontrolle, der Serverüberlastung verhindert, vor DDoS-Angriffen schützt und eine gleichmäßige Ressourcenverteilung gewährleistet. In TypeScript wird die Implementierung von Rate Limiting dank strenger Typisierung und Unterstützung von Asynchronität besonders komfortabel. In diesem Artikel betrachten wir beliebte Bibliotheken, Strategien und Codebeispiele für TypeScript.

\n\n

Wozu dient Rate Limiting?

\n
    \n
  • API-Schutz — Begrenzung der Anzahl von Anfragen eines einzelnen Clients (nach IP, Token oder ID).
  • \n
  • Missbrauchsverhinderung — Blockierung von Bots oder Skripten, die übermäßige Last erzeugen.
  • \n
  • Ressourcenverteilung — faire Nutzung des Backends zwischen Benutzern.
  • \n
  • Einhaltung von Limits externer Dienste — Kontrolle von Anfragen an Drittanbieter-APIs (z. B. OpenAI oder GitHub).
  • \n
\n\n

Beliebte Bibliotheken für Rate Limiting in TypeScript

\n\n

1. express-rate-limit

\n

Die beliebteste Bibliothek für Express.js. Sie fungiert als Middleware und unterstützt TypeScript von Haus aus. Ermöglicht die Festlegung eines Limits nach Zeit und benutzerdefinierter Handler bei Überschreitung.

\n

Installation:

\n
npm install express-rate-limit\nnpm install -D @types/express-rate-limit
\n

Anwendungsbeispiel:

\n
import express from 'express';\nimport rateLimit from 'express-rate-limit';\n\nconst app = express();\n\nconst limiter = rateLimit({\n    windowMs: 15 * 60 * 1000, // 15 Minuten\n    max: 100, // maximal 100 Anfragen pro Fenster\n    message: 'Zu viele Anfragen, bitte später versuchen.',\n    standardHeaders: true,\n    legacyHeaders: false,\n});\n\napp.use('/api', limiter); // Anwenden auf /api/*\n\napp.get('/api/data', (req, res) => {\n    res.json({ message: 'Erfolgreiche Antwort' });\n});\n\napp.listen(3000);
\n

Besonderheiten:

\n
    \n
  • Integrierte TypeScript-Unterstützung (Typen für Request und Response).
  • \n
  • Flexible Konfiguration: Schlüssel kann festgelegt werden (nach IP, userId, Token).
  • \n
  • Speicherung des Zustands im Arbeitsspeicher (standardmäßig) oder über Redis.
  • \n
\n\n

2. bottleneck

\n

Bibliothek für clientseitiges Rate Limiting — ideal, wenn ausgehende Anfragen kontrolliert werden müssen (z. B. an eine externe API). Funktioniert auf Basis von Warteschlangen und Verzögerungen.

\n

Installation:

\n
npm install bottleneck
\n

Beispiel mit TypeScript:

\n
import Bottleneck from 'bottleneck';\n\nconst limiter = new Bottleneck({\n    minTime: 200, // mindestens 200 ms zwischen Anfragen\n    maxConcurrent: 5, // maximal 5 gleichzeitige Anfragen\n    reservoir: 100, // Gesamtlimit pro Zeitraum\n    reservoirRefreshAmount: 100,\n    reservoirRefreshInterval: 60 * 1000, // alle 60 Sekunden\n});\n\nasync function fetchData(id: number): Promise<string> {\n    const response = await fetch(`https://api.example.com/data/${id}`);\n    return response.text();\n}\n\n// Funktion mit Limitierung umschließen\nconst limitedFetch = limiter.wrap(fetchData);\n\n// Verwendung\nasync function main() {\n    const results = await Promise.all([\n        limitedFetch(1),\n        limitedFetch(2),\n        limitedFetch(3),\n    ]);\n    console.log(results);\n}
\n

Vorteile:

\n
    \n
  • Unterstützt Typen für die umschlossene Funktion.
  • \n
  • Flexible Strategien: minTime, maxConcurrent, reservoir.
  • \n
  • Funktioniert sowohl in Node.js als auch im Browser.
  • \n
\n\n

3. p-limit

\n

Leichtgewichtige Bibliothek zur Begrenzung paralleler asynchroner Operationen. Nützlich, wenn die Anzahl gleichzeitig ausgeführter Promises kontrolliert werden muss.

\n

Installation:

\n
npm install p-                    

Empfehlungen