Projetando um limitador de taxa

Dec 04 2022
Aqui estão minhas notas sobre como projetar um limitador de taxa. O que é um limitador de taxa? 1- Balde de tokens 2- Referências de baldes com vazamento.
Balde Vazando

Aqui estão minhas notas sobre como projetar um limitador de taxa.

O que é um limitador de taxa?

  • Em redes de computadores, a limitação de taxa é usada para controlar a taxa de solicitações enviadas ou recebidas por um controlador de interface de rede .
  • No lado HTTP, limita o número de solicitações de clientes que podem ser enviadas em um período especificado.
  • Os usuários podem criar 1 ticket a cada 5 minutos
  • Os usuários podem criar 2 contas por dia com o mesmo endereço IP
  • Os usuários podem tentar 5 tentativas de login com falha por hora com o mesmo endereço IP em um dia
  • Um limitador de taxa impede ataques DoS
  • Pare o abuso do sistema
  • Reduz o custo
  • Evita sobrecarregar os servidores. Também reduz a carga do servidor
  • Melhore a experiência do usuário com menos tráfego
  • O limitador de taxa não deve diminuir o tempo de resposta HTTP do seu sistema.
  • Use menos memória
  • Mostrar exceções aos usuários quando suas solicitações forem bloqueadas devido à limitação de taxa.
  • Seu limitador de taxa não deve afetar todo o sistema. Por exemplo, se seu servidor de cache cair, seu sistema deve estar disponível.
  • Existem diferentes maneiras de implementar um limitador de taxa. Estes são; Implementação do lado do cliente, implementação do lado do servidor e uma maneira alternativa usando um gateway de API de terceiros.
  • Geralmente, o lado do cliente não é um lugar confiável para aplicar a limitação de taxa
  • Uma implementação do lado do servidor tem algumas vantagens internas porque você pode modificar a lógica do seu lado.
  • O uso de um gateway de API de terceiros é útil às vezes porque leva tempo para ser implementado.

1- Balde de fichas

  • Dois parâmetros principais; Tamanho do balde e taxa de reabastecimento.
  • Tamanho do balde: número máximo de tokens permitidos
  • Taxa de recarga: número de tokens colocados no balde em qualquer intervalo, como a cada segundo
  • Supondo que tenhamos um balde, a capacidade é definida como o número de tokens que ele pode conter. Sempre que um consumidor deseja acessar um terminal de API, ele deve obter um token do balde. O token é removido do depósito se estiver disponível e aceitar a solicitação. Se o token não estiver disponível, o servidor rejeitará a solicitação.
  • A cada intervalo fixo, precisamos reabastecer.
  • Se precisarmos limitar as solicitações HTTP com base em endereços IP, cada endereço IP exigirá um balde.
  • Pode causar condições de corrida em um ambiente distribuído (desvantagem)

2- Balde Vazando

  • Quando chega uma solicitação HTTP, o sistema verifica a fila. Se a fila não estiver cheia, a solicitação será adicionada à fila. Caso contrário, a solicitação é bloqueada.
  • As solicitações HTTP são extraídas da fila e processadas em intervalos regulares.
  • O processamento do primeiro item na fila ocorre em um intervalo regular ou primeiro a entrar, primeiro a sair (FIFO)
  • Divide a linha do tempo em janelas de tempo de tamanho fixo
  • Cada solicitação incrementa o contador.
  • A janela de tempo é considerada desde o início da unidade de tempo até o final da unidade de tempo.
  • Complexidade de espaço: O(1) — Armazenando a contagem da janela atual Complexidade de tempo: O(1) — Obtém uma operação de incremento atômico simples
  • O maior problema com isso é que os consumidores podem encontrar o tempo de reinicialização e maximizar a solicitação em um pequeno período de tempo que podem bombardeá-lo.
  • o algoritmo de janela fixa tem um problema como escrevi. Ele permite que mais solicitações passem pelas bordas de uma janela. Um log de janela deslizante está resolvendo esse problema.
  • mantém o tempo das requisições ordenadas em um Set ou Table (Ex: Redis)
  • A cada minuto, procuramos solicitações mais antigas e as filtramos. Em seguida, calcule a disponibilidade. Se a solicitação exceder a taxa de limite, ela será retida; caso contrário, será atendida.
  • Consome muita memória.
  • Caro para armazenar um número ilimitado de logs para cada solicitação.
  • Complexidade do Espaço: O(Máximo de solicitações vistas em uma janela de tempo) — Armazena todos os carimbos de data/hora das solicitações em uma janela de tempo.
  • Complexidade de tempo: O(Máximo de solicitações vistas em uma janela de tempo) — Excluindo um subconjunto de carimbos de data/hora
  1. Conte o número total de elementos no conjunto ordenado. Rejeite a solicitação se essa contagem for maior que nosso limite de limitação de “3”.
  2. Insira a hora atual no conjunto classificado e aceite a solicitação.
  • combina o baixo custo de processamento do algoritmo de janela fixa e as condições de contorno aprimoradas do log deslizante.
  • Complexidade do espaço: O (número de baldes)
  • Complexidade de tempo: O(1) — Busca o balde recente, incrementa e verifica a soma total dos baldes (pode ser armazenado em uma variável totalCount).
  • Para detalhes de implementação, você pode seguir este artigo.
  • Mais um artigo para melhor compreensão.
  1. Remova todos os contadores com mais de 1 minuto.
  2. incrementa o contador se a solicitação estiver chegando no balde atual.
  3. Solicitação bloqueada se o balde atual já excedeu o limite da garganta.

Referências

  • https://www.quinbay.com/blog/rate-limiter-implementation-token-bucket-algorithm
  • https://betterprogramming.pub/4-rate-limit-algorithms-every-developer-should-know-7472cb482f48
  • https://codeminion.hashnode.dev/rate-limiting-algorithms
  • https://goalgorithm.wordpress.com/2019/06/08/designing-an-api-rate-limiter/