Rate Limiting en TypeScript : guide complet des bibliothèques et de l'implémentation
\n\nLe rate limiting (limitation du débit des requêtes) est un mécanisme de contrôle du trafic qui empêche la surcharge du serveur, protège contre les attaques DDoS et assure une répartition équitable des ressources. En TypeScript, grâce au typage strict et à la prise en charge de l'asynchrone, l'implémentation du rate limiting devient particulièrement pratique. Dans cet article, nous allons examiner les bibliothèques populaires, les stratégies et les exemples de code pour TypeScript.
\n\nPourquoi le Rate Limiting est-il nécessaire ?
\n- \n
- Protection de l'API — limitation du nombre de requêtes d'un même client (par IP, jeton ou ID). \n
- Prévention des abus — blocage des bots ou scripts générant une charge excessive. \n
- Répartition des ressources — utilisation équitable du backend entre les utilisateurs. \n
- Respect des limites des services externes — contrôle des requêtes vers des API tierces (par exemple, OpenAI ou GitHub). \n
Bibliothèques populaires pour le Rate Limiting en TypeScript
\n\n1. express-rate-limit
\nLa bibliothèque la plus populaire pour Express.js. Fonctionne comme un middleware, prend en charge TypeScript nativement. Permet de définir une limite de temps et des gestionnaires personnalisés en cas de dépassement.
\nInstallation :
\nnpm install express-rate-limit\nnpm install -D @types/express-rate-limit\nExemple d'utilisation :
\nimport express from 'express';\nimport rateLimit from 'express-rate-limit';\n\nconst app = express();\n\nconst limiter = rateLimit({\n windowMs: 15 * 60 * 1000, // 15 minutes\n max: 100, // maximum 100 requêtes par fenêtre\n message: 'Trop de requêtes, veuillez réessayer plus tard.',\n standardHeaders: true,\n legacyHeaders: false,\n});\n\napp.use('/api', limiter); // Appliquer à /api/*\n\napp.get('/api/data', (req, res) => {\n res.json({ message: 'Réponse réussie' });\n});\n\napp.listen(3000);\nCaractéristiques :
\n- \n
- Prise en charge intégrée de TypeScript (types pour
RequestetResponse). \n - Configuration flexible : possibilité de définir une clé (par IP, userId, jeton). \n
- Stockage de l'état en mémoire (par défaut) ou via Redis. \n
2. bottleneck
\nBibliothèque pour le rate limiting côté client — idéale lorsqu'il faut contrôler les requêtes sortantes (par exemple, vers une API externe). Fonctionne sur la base de files d'attente et de délais.
\nInstallation :
\nnpm install bottleneck\nExemple avec TypeScript :
\nimport Bottleneck from 'bottleneck';\n\nconst limiter = new Bottleneck({\n minTime: 200, // minimum 200 ms entre les requêtes\n maxConcurrent: 5, // maximum 5 requêtes simultanées\n reservoir: 100, // limite totale pour la période\n reservoirRefreshAmount: 100,\n reservoirRefreshInterval: 60 * 1000, // toutes les 60 secondes\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// Encapsuler la fonction avec limitation\nconst limitedFetch = limiter.wrap(fetchData);\n\n// Utilisation\nasync function main() {\n const results = await Promise.all([\n limitedFetch(1),\n limitedFetch(2),\n limitedFetch(3),\n ]);\n console.log(results);\n}\nAvantages :
\n- \n
- Prend en charge les types pour la fonction encapsulée. \n
- Stratégies flexibles :
minTime,maxConcurrent,reservoir. \n - Fonctionne aussi bien dans Node.js que dans le navigateur. \n
3. p-limit
\nBibliothèque légère pour limiter les opérations asynchrones parallèles. Utile lorsqu'il faut contrôler le nombre de promesses exécutées simultanément.
\nInstallation :
\nnpm install p- Aussi dans la bibliothèque
Configuration des applications Swift (iOS/macOS) : bonnes pratiques et outils
go-playground/validator | Validation des données en Go
Planificateur de tâches en C++ : TaskFlow, CronCpp, Boost.Asio
Apache Commons Java : guide complet avec exemples pratiques