Dados essenciaisAPIs

Limitação de taxa

Limites de taxa atômicos no servidor. GCRA em um comando, ou limitadores nomeados com janela deslizante, token bucket ou leaky bucket. Sem precisar de Lua.

comando atômico por requisição
1
algoritmos
4
scripts Lua
0
Etapa 1 de 5
Permitido

10 requisições por minuto para o usuário 42. A resposta diz que foi permitido, qual é o limite e quantas restam.

Sessão de exemploplaying
# Permitido
hotkv> GCRA.LIMIT ratelimit:user:42 60000 10
1) (integer) 0
2) (integer) 10
3) (integer) 9
4) (integer) -1
5) (integer) 6000

Uma demonstração animada com comandos reais do HotKV e respostas de exemplo. Clique em qualquer etapa para ir direto a ela. Os comandos e as respostas ficam em inglês, exatamente como você os digita e vê no HotKV.

O problema

Uma API sem limites está a um cliente mal comportado de uma queda. Fazer a verificação no código da aplicação significa uma leitura, um cálculo e uma escrita, e as requisições simultâneas escapam pelas brechas entre eles. Muitos times acabam mantendo um script Lua só para torná-la atômica.

Como o HotKV resolve

GCRA.LIMIT decide e registra em uma etapa, então clientes simultâneos não conseguem passar os dois com o mesmo estado, e o limite se recompõe de forma suave em vez de zerar nas fronteiras da janela. Para limites que você gerencia pelo nome, RATELIMIT.CREATE configura um limitador de janela deslizante, token bucket ou leaky bucket, com estatísticas do que ele permitiu e negou.

Passo a passo

O que acontece, comando por comando

  1. 01

    Permitido

    10 requisições por minuto para o usuário 42. A resposta diz que foi permitido, qual é o limite e quantas restam.

    GCRA.LIMIT ratelimit:user:42 60000 10
  2. 02

    Uma rajada de um bot

    O scraper esgota a sua cota de rajada e depois é informado de quanto tempo esperar. Uma requisição negada não muda nada.

    GCRA.LIMIT ratelimit:bot:7 60000 10
  3. 03

    Limitador nomeado para um plano

    Clientes do plano gratuito recebem 100 requisições por minuto em uma janela deslizante.

    RATELIMIT.CREATE free_plan 100 60000 ALGO sliding_window
  4. 04

    Requisição com peso

    Um endpoint de exportação custa 20 unidades, então consome mais da cota.

    RATELIMIT.CHECK free_plan customer:881 COST 20
  5. 05

    Veja o que o limitador fez

    Configurações, chaves acompanhadas e os totais de requisições permitidas e negadas.

    RATELIMIT.STATS free_plan
Onde se encaixa

Cenários reais

APIs públicas

Cada chave de API recebe um limite por plano, com rajadas para os clientes bem comportados e um Retry-After preciso para o resto.

Formulários de login e cadastro

As tentativas por IP e por conta são limitadas para frear ataques de credential stuffing.

Chamadas de saída

As chamadas a uma API de parceiro ou a um provedor de LLM ficam dentro da cota em todos os workers da frota.

Integrado

O que você ganha

GCRA em um comando

Recomposição suave com rajadas, verificação e atualização atômicas e um tempo de nova tentativa quando há negação.

GCRA.LIMITGCRA.RESET

Limitadores nomeados

Janela deslizante, token bucket ou leaky bucket, criados uma vez e verificados por chave.

RATELIMIT.CREATERATELIMIT.CHECK

Requisições com peso

Chamadas caras podem contar como várias requisições. GCRA.LIMIT recebe uma contagem, e RATELIMIT.CHECK um COST.

COST

Estatísticas

Totais de permitidas e negadas por limitador.

RATELIMIT.STATS

Perguntas frequentes

Preciso de um script Lua para limitar a taxa?

Não. Tanto GCRA.LIMIT quanto RATELIMIT.CHECK fazem a verificação inteira como um comando atômico.

Qual devo usar?

GCRA.LIMIT não precisa de configuração e funciona em todos os planos. Os limitadores nomeados RATELIMIT.* acrescentam a escolha do algoritmo e estatísticas, e fazem parte dos planos Performance e Scale.

Quanto custa uma requisição negada?

Nada. Uma chamada GCRA negada deixa o limitador inalterado, então um cliente que tenta de novo não é penalizado ainda mais.

Casos de uso relacionados

Experimente com a sua própria carga de trabalho

O HotKV fala o protocolo Redis, então você pode apontar um cliente existente para ele e executar estes mesmos comandos.