Rate Limiting em TypeScript: bibliotecas, estratégias e exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Rate Limiting em TypeScript: guia completo sobre bibliotecas e implementação

\n\n

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

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

Bibliotecas populares para Rate Limiting em TypeScript

\n\n

1. express-rate-limit

\n

A biblioteca mais popular para Express.js. Funciona como middleware, com suporte nativo a TypeScript. Permite definir limite por tempo e handlers personalizados para excesso.

\n

Instalação:

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

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

Características:

\n
    \n
  • Suporte nativo a TypeScript (tipos para Request e Response).
  • \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
\n\n

2. bottleneck

\n

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

\n

Instalação:

\n
npm install bottleneck
\n

Exemplo com TypeScript:

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

Vantagens:

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

3. p-limit

\n

Biblioteca leve para limitar operações assíncronas paralelas. Útil quando é necessário controlar a quantidade de promessas executadas simultaneamente.

\n

Instalação:

\n
npm install p-                    

Recommendations