Rate Limiting: O que é e como implementar
Rate limiting controla quantas requisições um cliente pode fazer em um intervalo de tempo. Veja como funciona, por que importa e como implementar na prática.
Rate limiting controla quantas requisições um cliente pode fazer em um intervalo de tempo. Veja como funciona, por que importa e como implementar na prática.
Rate limiting é uma técnica de controle de tráfego que limita o número de requisições que um cliente pode fazer a um sistema em um determinado intervalo de tempo. Ele protege APIs e servidores contra sobrecarga, abuso e ataques, garantindo disponibilidade e uso justo dos recursos.
Em termos práticos, quando um usuário ou sistema tenta acessar um serviço além do limite permitido, o servidor responde com erro, geralmente HTTP 429 (Too Many Requests). Isso impede que um único cliente consuma todos os recursos, afetando a experiência dos demais.
Por que rate limiting é importante?
Rate limiting não é apenas uma questão de segurança, mas também de estabilidade e previsibilidade. Sem ele, um pico de tráfego, um script mal configurado ou um ataque de força bruta pode derrubar um serviço inteiro.
Entre os principais benefícios estão:
- Proteção contra abuso: impede bots de raspagem de dados (web scraping) e ataques de força bruta em endpoints de login.
- Estabilidade do sistema: evita que picos de requisições sobrecarreguem o servidor ou o banco de dados.
- Controle de custo: em serviços em nuvem, menos requisições significam menor consumo de recursos e, muitas vezes, menor custo.
- Uso justo: garante que nenhum cliente monopolize a capacidade do sistema, mantendo a qualidade para todos.
Um exemplo concreto: uma API pública de previsão do tempo pode permitir 100 requisições por hora por usuário. Se um usuário fizer 101 requisições em uma hora, a 101ª é bloqueada com HTTP 429. O sistema informa no cabeçalho de resposta quando o limite será redefinido, permitindo que o cliente aguarde antes de tentar novamente.
Como funciona o rate limiting?
O rate limiting funciona definindo um limite de requisições por janela de tempo, que pode ser fixa ou deslizante. Cada requisição é contabilizada para o cliente identificado, geralmente por endereço IP, chave de API ou token de usuário.
As configurações mais comuns incluem:
- Número máximo de requisições: quantas solicitações são permitidas no período.
- Janela de tempo: o intervalo em que o limite se aplica, como 1 minuto, 1 hora ou 1 dia.
- Identificador do cliente: o critério usado para agrupar requisições, como IP ou chave de API.
Quando o limite é atingido, o sistema pode bloquear a requisição, atrasá-la ou reduzir a qualidade do serviço, dependendo da política adotada.
Quais são os principais algoritmos de rate limiting?
Existem vários algoritmos para implementar rate limiting. Os mais comuns são:
- Token Bucket: cada cliente tem um balde com um número de tokens. A cada requisição, um token é consumido. Os tokens são reabastecidos a uma taxa fixa. Se o balde estiver vazio, a requisição é bloqueada. É simples e eficiente para picos de tráfego.
- Fixed Window: divide o tempo em janelas fixas (ex.: 1 minuto). Cada janela tem um contador de requisições. Quando o contador atinge o limite, as requisições são bloqueadas até a próxima janela. É fácil de implementar, mas permite o dobro de requisições no limite entre duas janelas.
- Sliding Window: semelhante ao fixed window, mas a janela é deslizante, considerando o histórico recente. Isso evita o problema do limite entre janelas, mas exige mais memória.
- Leaky Bucket: as requisições entram em uma fila e são processadas a uma taxa constante. Se a fila estiver cheia, a requisição é descartada. Suaviza picos, mas pode aumentar a latência.
A escolha do algoritmo depende do cenário. O token bucket é o mais usado em APIs públicas por permitir variações no tráfego sem bloquear usuários legítimos.
Como implementar rate limiting na prática?
A implementação de rate limiting varia conforme a tecnologia usada. Abaixo, um passo a passo genérico que serve para a maioria dos sistemas:
- Defina os limites: determine quantas requisições cada cliente pode fazer por período. Considere o perfil de uso típico e a capacidade do servidor.
- Escolha o algoritmo: token bucket é uma boa opção para começar, por equilíbrio entre simplicidade e eficiência.
- Identifique o cliente: use IP, chave de API ou token. Para APIs autenticadas, a chave é mais justa que IP, pois vários usuários podem compartilhar o mesmo IP.
- Armazene os contadores: use um banco de dados em memória, como Redis, que é rápido e suporta expiração. Para sistemas distribuídos, o Redis é a escolha padrão.
- Intercepte as requisições: em um middleware ou gateway, verifique o contador antes de processar a requisição. Se o limite foi atingido, retorne HTTP 429 com cabeçalhos informativos.
- Adicione cabeçalhos de resposta: envie
X-RateLimit-Limit,X-RateLimit-RemainingeX-RateLimit-Resetpara o cliente saber o status. - Teste e ajuste: monitore o uso real e ajuste os limites conforme necessário. Limites muito baixos podem bloquear usuários legítimos; muito altos, não protegem o sistema.
Em frameworks como Express (Node.js), é possível usar o pacote express-rate-limit. Em nginx, há o módulo ngx_http_limit_req_module. Em gateways de API, como Kong ou AWS API Gateway, o rate limiting costuma ser configurado sem código.
Quais são os desafios comuns na implementação?
O principal desafio é o ambiente distribuído. Quando o sistema roda em múltiplas instâncias, o contador precisa ser compartilhado, geralmente via Redis. Se cada instância mantiver seu próprio contador, o limite efetivo pode ser maior que o configurado.
Outro desafio é a identificação do cliente. Usar IP pode ser problemático em redes com NAT, onde vários usuários compartilham o mesmo IP. Nesse caso, a chave de API é mais precisa, mas exige autenticação prévia.
Há também o risco de bloquear usuários legítimos. Por isso, é importante definir limites generosos e monitorar erros 429. Uma política de retry com backoff exponencial, implementada no cliente, ajuda a reduzir bloqueios.
Resumo
Rate limiting é uma técnica essencial para proteger APIs e sistemas web contra sobrecarga e abuso. Ele controla o tráfego definindo limites de requisições por cliente em um período, usando algoritmos como token bucket ou sliding window. A implementação exige escolher limites adequados, armazenar contadores em memória e interceptar requisições com um middleware. Com rate limiting, o sistema fica mais estável, seguro e justo.
Perguntas frequentes sobre rate limiting
Qual a diferença entre rate limiting e throttling?
Rate limiting bloqueia requisições quando o limite é atingido. Throttling, por outro lado, atrasa as requisições para reduzir a velocidade, em vez de bloqueá-las. Na prática, os termos são usados de forma intercambiável, mas throttling é mais suave para o usuário.
O que significa o código HTTP 429?
HTTP 429 (Too Many Requests) indica que o usuário enviou requisições demais em um período. O cabeçalho Retry-After pode informar quanto tempo esperar antes de tentar novamente.
Rate limiting pode ser usado em páginas web?
Sim. Sites podem usar rate limiting para proteger formulários de login, páginas de busca ou endpoints de API. O navegador não é bloqueado, mas o servidor recusa requisições excessivas de um mesmo IP ou usuário.
Qual a diferença entre rate limiting e CAPTCHA?
Rate limiting limita a quantidade de requisições; CAPTCHA tenta distinguir humanos de bots. Eles são complementares: rate limiting reduz ataques automatizados, e CAPTCHA adiciona uma barreira para ações específicas, como login.
Como escolher o limite ideal de requisições?
O limite ideal depende do perfil de uso. Analise o tráfego normal do sistema e defina um limite que suporte os picos legítimos sem comprometer a infraestrutura. Comece com um valor conservador e ajuste com base em monitoramento.
Rate limiting funciona em APIs públicas?
Sim, é muito comum. APIs públicas usam rate limiting para evitar que um único usuário consuma todos os recursos. O Google Maps API, por exemplo, limita requisições por chave de API, e o GitHub limita por IP ou token.