O que um limite protege
Um limite de taxa não é uma ideia só. Cada limite numa aplicação real protege uma coisa diferente, e o que ele protege decide o algoritmo, o número e contra o que a requisição é contada.
Esta aplicação tem nove deles, num arquivo só, e eles não são variações de um mesmo tema.
Os nove
req/ip 300 por minuto tráfego anônimo, por IP
req/user 600 por minuto tráfego de quem está logado, por aluno
logins/ip não publicado tentativas de login, por IP
logins/email não publicado tentativas de login, por e-mail
signups/ip 3 por hora contas novas, por IP
comments/ip 10 por minuto posts na discussão, por IP
inquiries/ip 5 por hora contatos de parceiros, por IP
sandbox/user não publicado execuções de código, por aluno
verdict_poll/user não publicado consultas ao status da correção, por aluno
Os valores de login e de execução de código ficam de fora de propósito. Mesmo assim, repare na amplitude: de 600 por minuto até 3 por hora. É um fator de doze mil, e não é descuido. Cada número vem do que daria errado se ele não existisse.
Quatro proteções diferentes
Capacidade
O req/ip, com 300 por minuto, e o req/user, com 600 por minuto, protegem os servidores. Nada numa requisição isolada é perigoso. O perigo é o volume, e os dois limites ficam bem acima do que uma pessoa navegando conseguiria produzir. O tráfego anônimo é contado por IP e o de quem está logado, por aluno, por um motivo que a lição 6 explica.
Um segredo
O logins/ip e o logins/email protegem as senhas contra adivinhação. Os limites são baixos porque um punhado de tentativas já é generoso: quem esqueceu a senha usa o fluxo de redefinição, e não uma tentativa atrás da outra.
Um recurso escasso
O sandbox/user e o verdict_poll/user protegem o caminho de execução de código, em que cada requisição custa muito mais do que renderizar uma página. Os dois são contados por aluno.
Algo com custo fora do sistema
O signups/ip, com 3 por hora, e o inquiries/ip, com 5 por hora, protegem contra lixo que depois alguém precisa tratar: contas para limpar, contatos para ler.
flowchart TB
Q["o que este limite protege?"] --> C["capacidade: os servidores"]
Q --> S["um segredo: senhas"]
Q --> R["um recurso escasso: execução de código"]
Q --> H["tempo humano: cadastros, consultas"]
C --> C1["300-600/min. generoso, o volume é o único perigo"]
S --> S1["baixo. um punhado de tentativas já é generoso"]
R --> R1["dimensionado pelo custo por requisição, contado por aluno"]
H --> H1["3-5/hora. o custo cai sobre uma pessoa"]
O número segue a proteção
Nenhum desses limites poderia trocar de lugar com outro. Três logins por hora travariam pessoas de verdade, e trezentos não atrasariam um atacante. O número não é um botão que você gira até os alertas pararem. É uma afirmação sobre o que alguém legítimo faz e do que um atacante precisa.
O jeito justo de escolher: descreva o pior caso legítimo e deixe folga. Quem erra a senha erra três ou quatro vezes, e não cinquenta. Quem se cadastra faz isso uma vez, e não oito.
O que um limite não é
Um limite de taxa não é uma cota, e confundir os dois causa estrago de verdade.
Uma cota é um orçamento para um período longo, como mil chamadas de API por mês. Esgotá-la é um evento normal e esperado do negócio, com o qual a pessoa já contava.
Um limite de taxa trata do formato do tráfego no curto prazo. Passar dele é sinal de que algo está errado agora, e a resposta certa é ir mais devagar e tentar de novo, e não comprar mais.
Os dois falham de jeitos diferentes e devem ser comunicados de jeitos diferentes. Esta aplicação devolve 429 Too Many Requests com a mensagem "Please try again later". Essa frase enganaria numa cota, porque tentar mais tarde é justamente o que não vai ajudar.
Pontos-chave
- Esta aplicação tem nove throttles, de 600 por minuto a 3 por hora, e a amplitude é proposital, e não incoerente.
- Os limites protegem quatro coisas distintas: capacidade, um segredo, um recurso escasso e o tempo das pessoas.
- O número segue a proteção: descreva o pior caso legítimo e deixe folga.
- Um limite de taxa trata do formato do tráfego agora. Uma cota é um orçamento para um período longo.
- Passar de um limite significa ir mais devagar e tentar de novo. Esgotar uma cota significa que tentar de novo não vai ajudar.
Continue com a aula 2
O contador de janela fixa
Como o contador de janela fixa embute o número da janela na chave de cache e incrementa de forma atômica.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.