Rate Limiting em TypeScript: guia completo sobre bibliotecas e implementação
\n\nRate limiting (limitação de velocidade de requisições) é um mecanismo de controle de tráfego que previne sobrecarga do servidor, protege contra ataques DDoS e garante distribuição uniforme de recursos. Em TypeScript, graças à tipagem estrita e suporte a assincronia, a implementação de rate limiting se torna especialmente conveniente. Neste artigo, abordaremos bibliotecas populares, estratégias e exemplos de código para TypeScript.
\n\nPor que o Rate Limiting é necessário?
\n- \n
- Proteção de API — limitação do número de requisições de um único cliente (por IP, token ou ID). \n
- Prevenção de abusos — bloqueio de bots ou scripts que geram carga excessiva. \n
- Distribuição de recursos — uso justo do backend entre usuários. \n
- Cumprimento de limites de serviços externos — controle de requisições a APIs de terceiros (ex.: OpenAI ou GitHub). \n
Bibliotecas populares para Rate Limiting em TypeScript
\n\n1. express-rate-limit
\nA biblioteca mais popular para Express.js. Funciona como middleware, com suporte nativo a TypeScript. Permite definir limite por tempo e handlers personalizados para excesso.
\nInstalação:
\nnpm install express-rate-limit\nnpm install -D @types/express-rate-limit\nExemplo de uso:
\nimport 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 de 100 requisições por janela\n message: 'Muitas requisições, tente novamente mais 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: 'Resposta bem-sucedida' });\n});\n\napp.listen(3000);\nCaracterísticas:
\n- \n
- Suporte nativo a TypeScript (tipos para
RequesteResponse). \n - Configuração flexível: é possível definir chave (por IP, userId, token). \n
- Armazenamento de estado em memória (padrão) ou via Redis. \n
2. bottleneck
\nBiblioteca para rate limiting no lado do cliente — ideal quando é necessário controlar requisições de saída (ex.: para uma API externa). Funciona com base em filas e atrasos.
\nInstalação:
\nnpm install bottleneck\nExemplo com TypeScript:
\nimport Bottleneck from 'bottleneck';\n\nconst limiter = new Bottleneck({\n minTime: 200, // mínimo de 200 ms entre requisições\n maxConcurrent: 5, // máximo de 5 requisições simultâneas\n reservoir: 100, // limite total por período\n reservoirRefreshAmount: 100,\n reservoirRefreshInterval: 60 * 1000, // a 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// Encapsulando a função com limitação\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}\nVantagens:
\n- \n
- Suporta tipos para a função encapsulada. \n
- Estratégias flexíveis:
minTime,maxConcurrent,reservoir. \n - Funciona tanto em Node.js quanto no navegador. \n
3. p-limit
\nBiblioteca leve para limitar operações assíncronas paralelas. Útil quando é necessário controlar a quantidade de promessas executadas simultaneamente.
\nInstalação:
\nnpm install p- Também na biblioteca
Geração Swagger/OpenAPI para Java: bibliotecas e ferramentas
Quartz.NET para C# (.NET): Guia completo com exemplos práticos
Parsing de HTML em C# (.NET): bibliotecas HtmlAgilityPack e AngleSharp