Proteja serviços com rate limiting
Compare algoritmos de limitação e rode um deles em vários servidores.
- Comparar limitadores de janela fixa, janela deslizante e token bucket.
- Explicar como o tamanho do pico e a taxa sustentada se traduzem num token bucket.
- Projetar um limitador de taxa compartilhado por muitos servidores de API.
Um limitador de taxa (rate limiter) restringe quantas requisições um cliente (por usuário, chave de API ou IP) pode fazer num período. Ele protege os serviços contra abuso e sobrecarga, garante uso justo e níveis de preço, e limita o estrago de um cliente com bug. Requisições rejeitadas recebem HTTP 429 Too Many Requests, de preferência com um cabeçalho Retry-After.
Algoritmos de limitação
- Contador de janela fixa: conta as requisições por janela do relógio (por exemplo, por minuto). Simples e barato, mas um cliente pode mandar o limite inteiro no fim de uma janela e outro limite no início da próxima - cerca de 2× num curto intervalo.
- Log de janela deslizante: guarda o timestamp de cada requisição e conta as que estão dentro da última janela. Preciso, mas a memória cresce com o tráfego.
- Contador de janela deslizante: combina as contagens da janela atual e da anterior. Uma aproximação boa e barata.
- Token bucket: um balde guarda até capacidade tokens e é reabastecido a uma taxa constante. Cada requisição gasta um token. A capacidade define o pico permitido; a taxa de reabastecimento define a vazão sustentada.
Um exemplo: com limite de 3 por minuto, requisições nos segundos 1, 2, 2, 3 e 3 resultam em três permitidas e duas rejeitadas. Uma requisição no segundo 61 cai na janela seguinte, então é permitida.
Com muitos servidores de API, o contador local de cada servidor só vê parte do tráfego. Um limitador distribuído guarda os contadores num armazenamento compartilhado e rápido, como o Redis, usando operações atômicas (INCR com expiração, ou um script Lua para um token bucket) para que requisições concorrentes não entrem em condição de corrida. Os limitadores costumam ficar num API gateway ou num middleware e, se o armazenamento cair, devem falhar aberto ou fechado de forma deliberada.
Prática: compare limitadores
Experimente
Até 15 XPQual limitador segura a linha?
O limite é de 5 requisições a cada 60 segundos. Os pontos verdes passam, e os vermelhos recebem um 429.
- Em Pico na fronteira, compare a pior janela da janela fixa e do log deslizante.
- Quanto o log deslizante paga por essa precisão?
- Teste Constante com um token bucket. Qual é a diferença em relação à janela fixa?
- Limite
- 5 a cada 60 segundos
- Máximo permitido em uma janela
- 10
- Armazenado por cliente
- Um contador
Experimente
Até 15 XPEncontre a falha neste projeto
Um candidato descreve o limitador dele. Clique no que você questionaria se fosse o entrevistador.
Clique em todos os trechos suspeitos. São 3.
Principais conclusões
Token bucket: a capacidade é o pico, a taxa de reabastecimento é o limite sustentado.
Janelas fixas são baratas, mas permitem picos na fronteira.
Limitadores distribuídos precisam de um armazenamento compartilhado e de atualizações atômicas.
Quiz da aula
6 perguntas · aprovação com 5 acertos · até 50 XP
Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.
Dúvidas sobre esta lição
Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.
Carregando publicações…