Controle de Taxa de Requisições em Aplicações Koa

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-ratelimit quanto rate-limiter-flexible sã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.

Tags: koa koa-ratelimit rate-limiter-flexible rate limiting controle de taxa

Publicado em 6-12 05:35 por Thomas