Carregando
0x90Lição 10 de 13

Proteja serviços com rate limiting

Compare algoritmos de limitação e rode um deles em vários servidores.

20 min Questionário com 6 perguntas
Ao final desta lição, você saberá
  • 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 XP

Qual limitador segura a linha?

O limite é de 5 requisições a cada 60 segundos. Os pontos verdes passam, e os vermelhos recebem um 429.

  1. Em Pico na fronteira, compare a pior janela da janela fixa e do log deslizante.
  2. Quanto o log deslizante paga por essa precisão?
  3. Teste Constante com um token bucket. Qual é a diferença em relação à janela fixa?
Tráfego
Limitador
Limite
5 a cada 60 segundos
Máximo permitido em uma janela
10
Armazenado por cliente
Um contador

Experimente

Até 15 XP

Encontre a falha neste projeto

Um candidato descreve o limitador dele. Clique no que você questionaria se fosse o entrevistador.

Um limitador distribuído (rodada 1 de 1)Sinais encontrados 0/0

Clique em todos os trechos suspeitos. São 3.

Vamos usar um token bucket por chave de API. Cada um dos nossos 20 servidores de API mantém o próprio contador na memória. A cada requisição, lemos a contagem, conferimos e depois gravamos de volta. Clientes que passam do limite recebem um 429 com um cabeçalho Retry-After. Se o armazenamento dos contadores cair, a gente vê o que acontece,

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…