Implementar controle de taxa de requisições (rate limiting) em aplicações Koa é essencial para prevenir abusos e garantir a estabilidade do servidor, especialmente em cenários de alto tráfego. Diversas bibliotecas podem auxiliar nessa tarefa, como koa-ratelimit e rate-limiter-flexible, que permitem definir limites de requisições por endereço IP em um determinado período.
Utilizando koa-ratelimit para Controle de Taxa
1. Instalação da Dependência:
yarn add koa-ratelimit
# ou
npm install koa-ratelimit
# ou
pnpm install koa-ratelimit
2. Configuração no app.js:
A configuração do controle de taxa pode ser realizada diretamente no arquivo principle da aplicação. O exemplo a seguir demonstra o uso de um armazenamento em memória:
// app.js
const Koa = require('koa');
const cors = require('koa2-cors');
const app = new Koa();
const compress = require('koa-compress');
const port = 3000;
const router = require('./routers');
const errorHandler = require('./utils/errorHandler.js');
const helmet = require('koa-helmet');
const ratelimit = require('koa-ratelimit');
// Utilizando memória como armazenamento para o controle de taxa
const storage = new Map();
app.use(ratelimit({
driver: 'memory', // Opção: 'memory' ou 'redis'
db: storage, // Objeto de armazenamento
duration: 60 * 1000, // Período de restrição em milissegundos (1 minuto)
errorMessage: 'Limite de requisições excedido. Tente novamente mais tarde.',
id: (ctx) => ctx.ip, // Identificador da requisição (IP do cliente)
headers: {
remaining: 'X-RateLimit-Remaining', // Cabeçalho para requisições restantes
reset: 'X-RateLimit-Reset', // Cabeçalho para tempo de reinício
total: 'X-RateLimit-Limit' // Cabeçalho para limite total
},
max: 100, // Número máximo de requisições permitidas por IP/minuto
disableHeader: false, // Habilitar cabeçalhos de controle de taxa
}));
// ... outras configurações do app (middlewares, rotas, etc.)
Neste cenário, cada IP terá um limite de 100 requisições por minuto. Requisições excedentes resultarão na mensagem de erro especificada.
Utilizando rate-limiter-flexible
rate-limiter-flexible oferece uma alternativa robusta e flexível para controle de taxa, integrando-se facilmente com Koa e suportando funcionalidades avançadas.
1. Instalação da Dependência:
yarn add rate-limiter-flexible
# ou
npm install rate-limiter-flexible
# ou
pnpm install rate-limiter-flexible
2. Configuração no app.js:
O exemplo abaixo utiliza um limitador em memória, mas pode ser adaptado para Redis:
const Koa = require('koa');
const { RateLimiterMemory } = require('rate-limiter-flexible');
const app = new Koa();
// Inicialização do limitador de memória
const limiter = new RateLimiterMemory({
points: 100, // Pontos (requisições) permitidos
duration: 60, // Duração do período em segundos (1 minuto)
});
// Middleware de controle de taxa
app.use(async (ctx, next) => {
try {
// Verifica se a requisição excede o limite
await limiter.consume(ctx.ip); // Baseado no IP do cliente
await next(); // Continua para o próximo middleware se dentro do limite
} catch (rejected) {
// Retorna erro se o limite for excedido
ctx.status = 429; // Too Many Requests
ctx.body = 'Limite de requisições excedido. Tente novamente mais tarde.';
}
});
// Rota de exemplo
app.use(async (ctx) => {
ctx.body = 'Olá, Mundo!';
});
app.listen(3000, () => {
console.log('Servidor rodando na porta 3000');
});
Este código restringe cada IP a 100 requisições a cada 60 segundos. Exceder esse limite resultará em um status HTTP 429 e a mensagem de erro correspondente.
Considerações Finais
- Tanto
koa-ratelimitquantorate-limiter-flexiblesão soluções eficazes para controle de taxa em Koa. - A escolha entre armazenamento em memória ou Redis depende da arquitetura da sua aplicação (instância única vs. múltiplas instâncias atrás de um load balancer).
- Ajuste os parâmetros de taxa, duração e regras conforme as necessidades específicas do seu negócio.