Limitação de taxa de requisições em APIs é uma técnica que controla quantas solicitações um cliente pode fazer para uma API dentro de um período de tempo determinado. Quando um cliente ultrapassa esse limite, o servidor rejeita requisições adicionais até que a janela de tempo se reinicie. É o mecanismo principal que os serviços usam para controle de tráfego, gerenciamento de cotas e proteção contra abuso ou sobrecarga acidental.
Índice de Conteúdo
- Por Que a Limitação de Taxa Existe
- Como Funciona: A Mecânica Principal
- Algoritmos Comuns de Limitação de Taxa
- Headers HTTP de Limitação de Taxa que Você Realmente Verá
- Gerenciamento de Cota versus Limitação de Taxa
- Tratando 429 Muitas Requisições no Seu Código
- Exemplos Reais de Limitação de Taxa
- Melhores Práticas para Consumidores e Provedores de API
Por Que a Limitação de Taxa Existe
Uma API sem limitação de taxa é um convite aberto para o caos. Um único cliente com comportamento inadequado, um loop de tentativa bugado ou um ataque de negação de serviço deliberado pode consumir todos os recursos disponíveis do servidor e derrubar o serviço para todos. A limitação de taxa resolve vários problemas distintos ao mesmo tempo:
- Prevenção de DoS e DDoS: Limita o dano que uma única origem pode causar ao inundar o servidor com tráfego.
- Uso justo: Impede que um usuário pesado monopolize outros clientes na infraestrutura compartilhada.
- Controle de custos: Computação em nuvem, consultas de banco de dados e chamadas para serviços terceirizados custam dinheiro. Os limites mantêm as contas previsíveis.
- Proteção da API: Desacelera ataques de preenchimento de credenciais e raspagem automatizada que dependem de alto volume de requisições.
- Execução de SLA: Níveis pagos podem ser aplicados tecnicamente em vez de apenas contratualmente.
Como Funciona: A Mecânica Principal
Em sua forma mais simples, um limitador de taxa fica na frente da sua API e rastreia um contador para cada identidade de cliente. Essa identidade geralmente é uma das seguintes:
- Endereço IP (grosseiro, fácil de falsificar)
- Chave de API ou token OAuth (preciso, vinculado a uma conta)
- ID de usuário (para endpoints autenticados)
- Uma combinação, como IP mais caminho do endpoint
Cada requisição recebida incrementa o contador. Se o contador exceder o limite configurado antes da janela de tempo expirar, o servidor retorna
HTTP 429 Too Many Requests
e a requisição é descartada ou enfileirada. Quando a janela se reinicia, o contador é limpo e o cliente pode enviar novamente.
Onde esse contador reside importa muito. Contadores em memória em um único servidor são rápidos, mas falham assim que você escala horizontalmente. Sistemas de produção quase sempre armazenam o estado do limitador de taxa em um cache compartilhado, mais comumente Redis, para que cada nó no cluster veja a mesma contagem.
Algoritmos Comuns de Limitação de Taxa
O algoritmo que você escolher determina como o tráfego "em rajadas" é tratado. Cada um tem compensações reais.
| Algoritmo | Como Funciona | Melhor Para | Ponto Fraco |
|---|---|---|---|
| Janela Fixa | O contador é reiniciado em intervalos de relógio fixos (por exemplo, a cada minuto no minuto exato) | Execução de cota simples | Permite 2 vezes o limite nos limites da janela |
| Log de Janela Deslizante | Armazena um timestamp para cada requisição; conta apenas aquelas nos últimos N segundos | Limites precisos por cliente | Alto uso de memória em escala |
| Contador de Janela Deslizante | Aproxima a janela deslizante usando dois buckets de janela fixa e uma média ponderada | Precisão equilibrada e eficiência de memória | Ligeiramente aproximado, não exato |
| Token Bucket | Um bucket é preenchido com tokens a uma taxa constante; cada requisição consome um token | Permitir rajadas controladas | A rajada ainda pode aumentar a carga do servidor |
| Leaky Bucket | As requisições entram em uma fila e são processadas a uma taxa de fluxo de saída fixa | Suavizar tráfego para um serviço a jusante | Adiciona latência; a fila pode transbordar |
O token bucket é o algoritmo mais amplamente implantado em APIs reais. GitHub, Stripe e AWS usam variantes dele porque naturalmente acomoda rajadas curtas (um usuário clicando em várias coisas rapidamente) sem permitir inundações sustentadas.
Headers HTTP de Limitação de Taxa que Você Realmente Verá
Quando uma API aplica limitação de taxa, ela comunica o estado atual através de headers de resposta. Não há um padrão universal único, mas duas convenções dominam:
Convenção legada (usada por Twitter/X, GitHub v3 e muitos outros):
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 43
X-RateLimit-Reset: 1719878400
Padrão de rascunho IETF (campos de header RateLimit, draft-ietf-httpapi-ratelimit-headers):
RateLimit-Limit: 60
RateLimit-Remaining: 43
RateLimit-Reset: 17
A diferença principal: a convenção legada
X-RateLimit-Reset
é um timestamp Unix, enquanto a versão IETF é segundos até a reinicialização. Sempre verifique a documentação de qualquer API que você esteja integrando.
Quando o limite é atingido, o servidor também deve retornar um header
Retry-After
informando ao cliente exatamente quantos segundos esperar antes de tentar novamente. Nem toda API envia, mas as bem-comportadas fazem.
Gerenciamento de Cota versus Limitação de Taxa
Esses dois termos estão relacionados, mas não são idênticos, e confundi-los causa bugs reais de integração.
- Limitação de taxa controla a velocidade das requisições: 100 requisições por minuto, 10 requisições por segundo.
- Gerenciamento de cota controla o volume durante um período mais longo: 10.000 requisições por dia, 1 milhão de chamadas de API por mês.
Uma única API pode aplicar ambos simultaneamente. Google Maps Platform, por exemplo, aplica limites de taxa por segundo E limites de cota mensal. Você pode estar bem dentro de sua cota mensal, mas ainda ser acelerado por enviar 50 requisições em um segundo. Atingir a cota mensal retorna um código de erro diferente (geralmente
403 com uma mensagem de cota excedida) do que atingir o limite de taxa por segundo (429).
Tratando 429 Muitas Requisições no Seu Código
Receber um429 não é um erro fatal. É a API dizendo para você desacelerar. A resposta correta é um
backoff exponencial com jitter.
Aqui está um exemplo mínimo em Python:
import time
import random
import requests
def call_with_backoff(url, headers, max_retries=5):
for attempt in range(max_retries):
response = requests.get(url, headers=headers)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 2 ** attempt))
jitter = random.uniform(0, 1)
time.sleep(retry_after + jitter)
continue
response.raise_for_status()
return response
raise Exception("Max retries exceeded")
Pontos-chave nesse padrão:
-
Leia
Retry-Afterprimeiro. Se a API fornecê-lo, use-o em vez de adivinhar. - Adicione jitter aleatório para que múltiplos clientes não tentem novamente no mesmo momento exato (o problema do "rebanho trovejante").
- Coloque um limite no número de tentativas. Um loop de tentativa infinita é em si uma forma de abuso.
- Registre as respostas 429. Limitação de taxa frequente é um sinal de que você precisa armazenar resultados em cache, agrupar requisições ou atualizar seu plano.
A entrada MDN Web Docs para HTTP 429 tem uma referência concisa para a semântica do código de status se você quiser o detalhe do nível de especificação.
Exemplos Reais de Limitação de Taxa
Ver como as principais APIs implementam isso torna os conceitos concretos:
| API | Limite de Taxa | Escopo | Notas |
|---|---|---|---|
| GitHub REST API | 5.000 requisições/hora (autenticado) | Por token | 60/hora não autenticado |
| Stripe | 100 requisições de leitura / 100 de escrita por segundo | Por conta | Token bucket; retorna 429 com Retry-After |
| Twitter/X v2 | Varia por endpoint (por exemplo, 15 requisições/15 min para busca de usuário) | Por app ou por usuário | Janelas fixas de 15 minutos |
| OpenAI API | Baseado em níveis (por exemplo, 500 RPM no Nível 1) | Por organização | Limites separados de token por minuto também se aplicam |
| Cloudflare Workers | 100.000 requisições/dia (nível gratuito) | Por conta | Limite de cota diária no estilo, não aceleração por segundo |
Melhores Práticas para Consumidores e Provedores de API
Quer você esteja construindo uma API ou consumindo uma, os mesmos princípios se aplicam dos dois lados da cerca.
Se você está consumindo uma API:
- Armazene respostas em cache agressivamente. A requisição mais barata é aquela que você nunca envia.
- Agrupe requisições sempre que a API suportar (por exemplo, busque 100 registros em uma chamada em vez de 100 chamadas individuais).
- Use webhooks ou eventos enviados pelo servidor em vez de polling quando a API oferecê-los.
-
Monitore seu header
X-RateLimit-Remainingproativamente, não apenas quando você atinge 429. - Implemente circuit breakers em serviços de longa duração para que uma API com limitação de taxa não cascateie em uma falha completa da aplicação.
Se você está construindo uma API:
- Aplique limites no nível do gateway de API (Kong, AWS API Gateway, Nginx), não dentro de cada microsserviço.
- Diferencie limites por nível: usuários gratuitos recebem 100 RPM, usuários pagos recebem 1.000 RPM.
-
Sempre retorne
Retry-Afterem respostas 429. Clientes que o respeitam vão recuar de forma limpa. - Registre eventos de limitação de taxa. Um cliente atingindo limites constantemente tem um bug ou é um mau ator.
- Documente seus limites claramente. Limites não documentados são um pesadelo de suporte.
Configure o Controle de Tráfego do Seu Servidor Sem Escrever Código
Gerenciar limitação de taxa de API e controle de tráfego geralmente começa na camada de configuração do servidor. DevToolBox oferece aos desenvolvedores ferramentas gratuitas baseadas em navegador para gerar, testar e copiar configurações de servidor instantaneamente, para que você gaste menos tempo com boilerplate e mais tempo com sua lógica de API real.
Experimente Nossas Ferramentas Gratuitas →
A limitação de taxa coloca um limite rígido no número de requisições em uma janela e rejeita qualquer coisa acima do limite com um erro 429. A aceleração é mais suave: ela desacelera requisições em excesso enfileirando-as ou adicionando atrasos deliberados em vez de rejeitá-las completamente. Na prática, muitos desenvolvedores usam os termos de forma intercambiável, e algumas APIs fazem ambos dependendo de quão longe você está acima do limite.
O culpado mais comum é uma rajada de requisições simultâneas chegando no mesmo instante. Mesmo que seu volume total esteja bem, enviar 50 requisições simultaneamente pode acionar um limite por segundo. Outras causas incluem chaves de API compartilhadas em vários serviços, um problema de limite de janela fixa onde duas janelas se sobrepõem, ou limites secundários não documentados em endpoints específicos. Adicione registro de requisições para ver o tempo exato de suas chamadas.
Ao limitar requisições por IP ou por chave de API, a limitação de taxa garante que nenhuma origem única possa monopolizar recursos do servidor. Uma resposta 429 é barata de gerar em comparação com o processamento de uma requisição completa, então o servidor permanece responsivo mesmo sob tráfego de ataque pesado. Dito isto, a limitação de taxa sozinha não é suficiente contra DDoS em larga escala. Ela funciona melhor como uma camada em uma defesa mais ampla que inclui filtragem no nível de CDN e limpeza de tráfego no nível da infraestrutura.
A resposta padrão é HTTP 429 Muitas Requisições. Seu código não deve tratá-la como uma falha permanente. Leia o header Retry-After se presente e aguarde esse número de segundos antes de tentar novamente. Se o header estiver ausente, use backoff exponencial começando em 1-2 segundos e dobrando a cada tentativa. Sempre adicione jitter aleatório para evitar tentativas sincronizadas de múltiplos clientes atingindo o servidor no mesmo momento.
Sim, e esta é na verdade a abordagem recomendada para a maioria das APIs. Endpoints caros como busca ou geração de relatório geralmente recebem limites mais apertados do que endpoints simples de leitura. A API do Twitter é um bom exemplo: o endpoint de busca de usuário tem um limite diferente do endpoint de busca de tweet. Limites por endpoint permitem que você proteja suas operações mais intensivas em recursos sem restringir desnecessariamente chamadas leves.
O algoritmo token bucket imagina um bucket que se preenche com tokens a uma taxa fixa, digamos 10 tokens por segundo. Cada requisição de API consome um token. Se o bucket tem tokens, a requisição passa. Se estiver vazio, a requisição é rejeitada. A vantagem principal é que permite rajadas curtas: se um cliente ficou inativo por 5 segundos, ele acumula 50 tokens e pode disparar 50 requisições de uma vez. Isto corresponde melhor ao comportamento real do usuário do que um contador de janela fixa rígido.