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.

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
- 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”.
- 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.
- Remova todos os contadores com mais de 1 minuto.
- incrementa o contador se a solicitação estiver chegando no balde atual.
- 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/
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino