Bastidores

Desenvolvimento· Arrumando a casa · parte 19

O limite de 10 por minuto que deixou passar muito mais.

Entenda quando o Rate Limiting dos Workers é aproximado e como testei em produção um contador exato com rajadas em IPv4 e IPv6.

Um limite de 10 por minuto com muito mais pedidos passando, e ao lado um contador exato.

Configurei um limite de 10 pedidos por minuto e vi passar bem mais que 10. A configuração parecia certa no código. Sob uma rajada rápida, o comportamento foi diferente do esperado.

O caso aconteceu num produto que ainda não apresentei aqui. O binding de Rate Limiting dos Cloudflare Workers conta por local, e essa forma de contar deixou passar rajadas acima do limite configurado. Para organizar a arquitetura, precisei separar o limite aproximado do limite que precisa ser exato.

O número configurado precisa de um teste

Um limite escrito na configuração comunica uma intenção, mas não prova a retenção real. Para saber o que acontece sob rajadas, é preciso disparar requisições em sequência e contar o retorno. Foi nesse teste prático que o limite de 10 por minuto aceitou bem mais que 10.

A contagem por local explica esse comportamento do binding em borda. Como os pedidos chegam a instâncias diferentes da rede, cada nó mantém sua própria fatia da contagem. Quando a regra de negócio exige precisão absoluta, esse modelo distribuído deixa passar picos indesejados.

O binding continua bom para limites folgados, como 60 por minuto na API geral. Nesse cenário, pequenas variações temporárias não afetam a segurança da aplicação. A contagem aproximada atende perfeitamente quando o objetivo é apenas conter abusos grosseiros.

Para um limite que precisa ser exato, como login e envio de código, a exigência é diferente. Nessas rotas sensíveis, qualquer brecha em rajada compromete a regra de segurança. Ali a contagem precisa de um único ponto centralizado de verdade.

O contador exato usa um Durable Object

Para os limites que precisam ser exatos, troquei o binding por um Durable Object com SQLite. Ele conta por IP com hash e libera a passagem se o objeto falhar. Um IPv6 conta pelo seu /64.

Essa regra garante que uma eventual falha no objeto libere a passagem sem travar a navegação. O contador exato opera enquanto o Durable Object responde normalmente. Se houver falha de infraestrutura, a requisição passa sem gerar um erro inesperado.

A identificação precisa tratar cada protocolo de forma adequada. O hash do IP isola a origem sem armazenar o endereço original no banco local. No IPv6, agrupar pelo bloco /64 evita que um mesmo remetente contorne o limite apenas rotacionando endereços da mesma faixa.

Esse desenho centraliza a contagem de forma consistente. Cada tentativa de autenticação consulta o mesmo estado compartilhado no Durable Object. O controle deixa de depender de replicações assíncronas entre pontos da rede.

A rajada precisa passar pelos dois protocolos

A prova está em produção: 10 aceitos e 30 recusados, tanto em IPv4 quanto em IPv6. O teste confirma que a regra atua nos dois caminhos em vez de assumir que o resultado de um representa o outro. Essa checagem direta afasta qualquer suposição sobre a borda.

Num teste, uma máquina com IPv4 e IPv6 conta como dois clientes. Use curl -4 e curl -6. Testar apenas um dos protocolos deixaria metade das rotas sem validação real.

A verificação separada impede falsos positivos no diagnóstico. Se o teste alternar entre protocolos durante os disparos, o contador enxerga duas origens distintas e aceita o dobro de requisições. Rodar cada bateria de testes de forma isolada garante a medição correta.

Essa separação comprova o funcionamento exato da proteção. Os dois mecanismos têm papéis bem definidos na infraestrutura de borda. O teste com rajadas confirma que a regra de bloqueio atua exatamente no limite configurado.

A conferência continua nos outros produtos

Registrei o caso numa lista de alertas da stack comum, com onde foi provado e o que conferir nos outros produtos. Um usa o mesmo binding com o limite do Better Auth desligado. O Garfim ainda não foi conferido.

Os dois ficaram anotados na lista de alertas da stack comum para acompanhamento. Essa documentação define qual operação está protegida, qual mecanismo conta e se aquele limite precisa ser exato. Uma regra que protege a API geral não deve ser assumida como suficiente para rotas de login.

A conclusão técnica é sempre medir a passagem real sob rajada nos dois protocolos. O número na configuração só ganha valor prático quando o teste confirma o comportamento esperado. Outro problema compartilhado que registrei na mesma stack está no relato sobre conexões presas atrás do Hyperdrive.

Teste local verde até no S23, e o staging ainda achou um defeito.08 nov · DesenvolvimentoOutra IA revisou 4.170 traduções da IA em inglês e corrigiu 307.08 nov · Inteligência artificialA conta live do Stripe estava ativa, mas falhou na minha conferência.08 nov · LançamentoTrês regras de HSTS num só domínio: por que deixei o preload de fora.08 nov · DesenvolvimentoUma palavra a menos derrubou 13 páginas que já estavam no ar.08 nov · DesenvolvimentoOutro agente de IA revisou meu código 71 vezes e criou dois defeitos.08 nov · Inteligência artificialDepois de 20 anos de carreira, publiquei meu primeiro pacote no npm.08 nov · LançamentoSozinho com IA: iPhone, Android, SaaS com MCP e CLI, e já faturando.07 nov · BastidoresCopiei a mecânica dos líderes e recusei a mentira deles.07 nov · BastidoresA pergunta de LGPD que trava a venda: e o backup?07 nov · ProdutoA IA calibrou minha câmera pelos números. Ficou cara de lanterna.07 nov · BastidoresUm usuário não via o dia de ontem. Abri todo o passado do Garfim.07 nov · Produto62% baixavam o Garfim. O problema estava antes da página.07 nov · LançamentoO idioma certo na tela pode virar o errado no servidor.07 nov · DesenvolvimentoO limite de 10 por minuto que deixou passar muito mais.07 nov · DesenvolvimentoUm PR do Dependabot travou meu banco e as rotas voltaram 500.07 nov · DesenvolvimentoMeus produtos novos não começam do zero. Começam de um clone.07 nov · DesenvolvimentoTirei uma trava da minha IA e a resposta caiu de 5,5 s para 3,7 s.07 nov · DesenvolvimentoTroquei velocidade por uma auditora que confere cada frase.07 nov · Inteligência artificialEscrevi o método CERNE lendo seis especificações reais.07 nov · Inteligência artificialComo anunciar na Meta e vender online no CPF sem abrir empresa.05 nov · BastidoresPausei anúncios depois de ignorar o resultado anterior.05 nov · BastidoresComo depurei um erro de API sem log no registro do Garfim.05 nov · DesenvolvimentoComo forçar atualização no React Native antes de um defeito grave.05 nov · DesenvolvimentoComo levei o LCP do ClipLeve de 9,9 s para menos de 1,5 s.05 nov · DesenvolvimentoPubliquei 650 páginas contra a regra do meu método.05 nov · Inteligência artificialUma conta para organizar erros, métricas e IA dos meus produtos.05 nov · BastidoresSeparei o painel do site e pus o Access na porta.05 nov · DesenvolvimentoUma lista de 69 itens encontrou requisitos só no papel.05 nov · BastidoresO antispam esperou tanto que parou o formulário.05 nov · DesenvolvimentoCortei a publicação de 17 minutos para 4 na minha máquina.05 nov · DesenvolvimentoEu gravo. A IA corta, legenda e entrega o vídeo curto.05 nov · Inteligência artificialComo criar anúncios UGC com IA usando o método PROVA.05 nov · Inteligência artificialA IA disse que usou as skills. A página provou o contrário.05 nov · Inteligência artificialNove páginas reprovadas antes de encontrar uma identidade.05 nov · Inteligência artificialEm 48 horas, juntei domínios, e‑mail, sites e medição num padrão só.30 out · BastidoresPor que tirei os três sites do GPT Sites.30 out · DesenvolvimentoComo troquei o luisjunior.ai com cerca de 10 segundos fora do ar.30 out · DesenvolvimentoRefiz o luisjunior.ai do zero: cada afirmação com prova.30 out · LançamentoUm padrão para todos os domínios, inclusive os de produtos futuros.30 out · BastidoresTodo o e‑mail dos meus domínios saiu do VPS num só dia.30 out · DesenvolvimentoDecidi mover o envio do Garfim do Resend para a Cloudflare.30 out · DesenvolvimentoO método FONTE para aparecer no Google e nas respostas de IA.30 out · Inteligência artificialTrês sites, três decisões de busca, e uma delas é não gerar páginas.30 out · Inteligência artificialMedição de vários sites num painel só, com consentimento.30 out · BastidoresComo a IA me apresenta mídias para aprovação29 out · Inteligência artificialO Garfim chegou ao Google Play. Agora tem Android e iPhone.22 out · LançamentoConseguir testadores e esperar 14 dias: a reta final do Garfim no Android.22 out · BastidoresO ClipLeve chegou à App Store. O que aprendi até aqui.20 out · LançamentoO ClipLeve foi rejeitado de novo. Dessa vez, por uma palavra.20 out · ProdutoO Garfim foi aprovado. E já está na App Store.16 out · LançamentoA última negativa do Garfim: câmera, assinatura e o caminho inteiro.16 out · LançamentoClipLeve: o cuidado por trás de um vídeo mais leve.12 out · ProdutoPor que restaurar uma assinatura pode falhar em outra conta.12 out · ProdutoQuando um aplicativo pode dizer que sua conta foi excluída?12 out · ProdutoO que a primeira negativa da App Store me fez explicar.08 out · LançamentoO que quero aprender com o teste fechado do Garfim.08 out · ProdutoO trabalho de uma assinatura continua depois da compra.03 out · DesenvolvimentoPor que o Garfim ganhou um plano gratuito.03 out · ProdutoO login funcionou. Por que a tela do Garfim não saiu do lugar?03 out · LançamentoPagenello: um site começa pelo que o visitante veio fazer.03 out · LançamentoComo uma foto do almoço vira um produto.27 set · ConcepçãoAs decisões que continuo tomando ao desenvolver com IA.27 set · DesenvolvimentoApresentar o Garfim ao público também é um teste do produto.27 set · Lançamento

GET luisjunior.ai/llms.txt

Esta é a versão do site escrita para modelos de linguagem: os mesmos fatos, sem layout, prontos para um assistente de IA ler e citar. Agentes no Chrome também encontram aqui ferramentas WebMCP para consultar produtos, textos e contato.

conectando…0 tokens · 0 tok/s