Apex T.I.C

Endpoint: Rate Limiting

O que é Rate Limiting?

Rate Limiting é uma técnica fundamental para controlar o fluxo de requisições a um sistema, definindo limites máximos permitidos em determinado intervalo de tempo. Isso protege recursos, mantém a estabilidade do serviço e melhora a experiência dos usuários, prevenindo abusos e ataques.

Sem o Rate Limiting, sistemas ficam vulneráveis a ataques DoS (Denial of Service), brute force e sobrecarga acidental causada por clientes mal configurados.

Objetivos Principais do Rate Limiting

Como Funciona o Rate Limiting

O servidor monitora quantas requisições cada cliente faz dentro de um período específico. Quando o limite é atingido, novas requisições são rejeitadas ou atrasadas, dependendo da política aplicada.

Para aplicar a técnica, é necessário escolher um identificador para o cliente, que pode ser:

Essa identificação permite aplicar limites individualizados e evitar penalizar injustamente outros usuários.

Tipos de Algoritmos para Rate Limiting

Vários algoritmos são usados, dependendo do nível de precisão e recursos do sistema:

Fixed Window Counter

Conta requisições em uma janela de tempo fixa (ex: 1 minuto). Simples, mas pode causar picos quando a janela reinicia.

Sliding Log

Armazena timestamps de cada requisição para cálculo mais preciso. Pode consumir muita memória em alto tráfego.

Sliding Window Counter

Combina fixed window com suavização dos picos, dividindo a janela em sub-janelas, balanceando precisão e eficiência.

Token Bucket

Permite "acumular" tokens que permitem requisições até um limite, permitindo picos controlados e regularizando o fluxo.

Leaky Bucket

Assemelha-se ao Token Bucket, mas libera requisições a uma taxa constante, suavizando bursts.

Exemplo Visual do Funcionamento - Token Bucket

Imagine um balde com tokens que enchem a uma taxa constante. Cada requisição "consome" um token. Se não houver tokens, a requisição é rejeitada ou enfileirada.

Token Bucket Example

Fonte da imagem: Wikipedia - Token Bucket

Implementação Prática em Node.js com express-rate-limit

Um exemplo real com o middleware express-rate-limit para controlar 100 requisições a cada 15 minutos:

const express = require('express');
const rateLimit = require('express-rate-limit');

const app = express();

// Configura o limitador
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 100, // limite máximo de requisições por IP
  message: {
    error: 'Você excedeu o número máximo de requisições. Tente novamente mais tarde.'
  },
  standardHeaders: true, // Retorna cabeçalhos de rate limit padrão
  legacyHeaders: false,   // Desativa cabeçalhos obsoletos
});

// Aplica o middleware a todas as rotas
app.use(limiter);

app.get('/', (req, res) => {
  res.send('Bem-vindo à API da Apex T.I.C!');
});

app.listen(3000, () => {
  console.log('Servidor rodando na porta 3000');
});

Cabeçalhos HTTP para Rate Limiting

APIs modernas usam cabeçalhos para informar ao cliente sobre o estado do limite, ajudando a criar clientes mais resilientes:

Exemplo de resposta:

HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 75
X-RateLimit-Reset: 60

Desafios Técnicos e Soluções

Casos Reais e Integrações

Empresas como Google, Twitter e GitHub usam Rate Limiting em suas APIs públicas para garantir estabilidade e experiência de uso justa.

Ferramentas populares para implementar Rate Limiting incluem: