Rate Limiting in TypeScript: Vollständiger Leitfaden zu Bibliotheken und Implementierung
\n\nRate 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\nWozu 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
Beliebte Bibliotheken für Rate Limiting in TypeScript
\n\n1. express-rate-limit
\nDie 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.
\nInstallation:
\nnpm install express-rate-limit\nnpm install -D @types/express-rate-limit\nAnwendungsbeispiel:
\nimport 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);\nBesonderheiten:
\n- \n
- Integrierte TypeScript-Unterstützung (Typen für
RequestundResponse). \n - Flexible Konfiguration: Schlüssel kann festgelegt werden (nach IP, userId, Token). \n
- Speicherung des Zustands im Arbeitsspeicher (standardmäßig) oder über Redis. \n
2. bottleneck
\nBibliothek 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.
\nInstallation:
\nnpm install bottleneck\nBeispiel mit TypeScript:
\nimport 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}\nVorteile:
\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
3. p-limit
\nLeichtgewichtige Bibliothek zur Begrenzung paralleler asynchroner Operationen. Nützlich, wenn die Anzahl gleichzeitig ausgeführter Promises kontrolliert werden muss.
\nInstallation:
\nnpm install p- Auch in der Bibliothek
Swagger/OpenAPI-Generierung für Node.js (JavaScript): Tools und Beispiele
Fiber für Go: Vollständiges Tutorial mit Beispielen
HTML-Parsing in C++: Bibliotheken und Beispiele für die Arbeit mit DOM und XPath
Reaktive Programmierung in TypeScript: Bibliothek RxJS