Rate Limiting en TypeScript : bibliothèques, stratégies et exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Rate Limiting en TypeScript : guide complet des bibliothèques et de l'implémentation

\n\n

Le 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\n

Pourquoi 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
\n\n

Bibliothèques populaires pour le Rate Limiting en TypeScript

\n\n

1. express-rate-limit

\n

La 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.

\n

Installation :

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

Exemple d'utilisation :

\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 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);
\n

Caractéristiques :

\n
    \n
  • Prise en charge intégrée de TypeScript (types pour Request et Response).
  • \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
\n\n

2. bottleneck

\n

Bibliothè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.

\n

Installation :

\n
npm install bottleneck
\n

Exemple avec TypeScript :

\n
import 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}
\n

Avantages :

\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
\n\n

3. p-limit

\n

Bibliothè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.

\n

Installation :

\n
npm install p-                    

Recommendations