Limitación de Tasa en TypeScript: bibliotecas, estrategias y ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Limitación de Tasa en TypeScript: guía completa sobre bibliotecas e implementación

\n\n

La limitación de tasa (rate limiting) es un mecanismo de control de tráfico que previene la sobrecarga del servidor, protege contra ataques DDoS y garantiza una distribución uniforme de los recursos. En TypeScript, gracias al tipado estricto y la compatibilidad con asincronía, la implementación de la limitación de tasa se vuelve especialmente conveniente. En este artículo, analizaremos bibliotecas populares, estrategias y ejemplos de código para TypeScript.

\n\n

¿Por qué es necesaria la Limitación de Tasa?

\n
    \n
  • Protección de API — limitar el número de solicitudes de un solo cliente (por IP, token o ID).
  • \n
  • Prevención de abusos — bloquear bots o scripts que generan una carga excesiva.
  • \n
  • Distribución de recursos — uso justo del backend entre los usuarios.
  • \n
  • Cumplimiento de límites de servicios externos — control de solicitudes a APIs de terceros (por ejemplo, OpenAI o GitHub).
  • \n
\n\n

Bibliotecas populares para Limitación de Tasa en TypeScript

\n\n

1. express-rate-limit

\n

La biblioteca más popular para Express.js. Funciona como middleware, compatible con TypeScript de forma nativa. Permite establecer un límite por tiempo y manejadores personalizados para excederlo.

\n

Instalación:

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

Ejemplo de uso:

\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 minutos\n    max: 100, // máximo 100 solicitudes por ventana\n    message: 'Demasiadas solicitudes, intente más tarde.',\n    standardHeaders: true,\n    legacyHeaders: false,\n});\n\napp.use('/api', limiter); // Aplicar a /api/*\n\napp.get('/api/data', (req, res) => {\n    res.json({ message: 'Respuesta exitosa' });\n});\n\napp.listen(3000);
\n

Características:

\n
    \n
  • Soporte integrado para TypeScript (tipos para Request y Response).
  • \n
  • Configuración flexible: se puede definir una clave (por IP, userId, token).
  • \n
  • Almacenamiento de estado en memoria (por defecto) o mediante Redis.
  • \n
\n\n

2. bottleneck

\n

Biblioteca para limitación de tasa del lado del cliente — ideal cuando se necesita controlar las solicitudes salientes (por ejemplo, a una API externa). Funciona basándose en colas y retrasos.

\n

Instalación:

\n
npm install bottleneck
\n

Ejemplo con TypeScript:

\n
import Bottleneck from 'bottleneck';\n\nconst limiter = new Bottleneck({\n    minTime: 200, // mínimo 200 ms entre solicitudes\n    maxConcurrent: 5, // máximo 5 solicitudes concurrentes\n    reservoir: 100, // límite total por período\n    reservoirRefreshAmount: 100,\n    reservoirRefreshInterval: 60 * 1000, // cada 60 segundos\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// Envolver la función con limitación\nconst limitedFetch = limiter.wrap(fetchData);\n\n// Uso\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

Ventajas:

\n
    \n
  • Compatible con tipos para la función envuelta.
  • \n
  • Estrategias flexibles: minTime, maxConcurrent, reservoir.
  • \n
  • Funciona tanto en Node.js como en el navegador.
  • \n
\n\n

3. p-limit

\n

Biblioteca ligera para limitar operaciones asíncronas paralelas. Útil cuando se necesita controlar la cantidad de promesas ejecutándose simultáneamente.

\n

Instalación:

\n
npm install p-                    

Recommendations