Rate Limiter

Objetivo: Desenvolver um rate limiter em Go que possa ser configurado para limitar o número máximo de requisições por segundo com base em um endereço IP específico ou em um token de acesso.

Descrição: O objetivo deste desafio é criar um rate limiter em Go que possa ser utilizado para controlar o tráfego de requisições para um serviço web. O rate limiter deve ser capaz de limitar o número de requisições com base em dois critérios:

Endereço IP: O rate limiter deve restringir o número de requisições recebidas de um único endereço IP dentro de um intervalo de tempo definido.
Token de Acesso: O rate limiter deve também poderá limitar as requisições baseadas em um token de acesso único, permitindo diferentes limites de tempo de expiração para diferentes tokens. O Token deve ser informado no header no seguinte formato:
    API_KEY: <TOKEN>
As configurações de limite do token de acesso devem se sobrepor as do IP. Ex: Se o limite por IP é de 10 req/s e a de um determinado token é de 100 req/s, o rate limiter deve utilizar as informações do token.

Requisitos:

O rate limiter deve poder trabalhar como um middleware que é injetado ao servidor web
O rate limiter deve permitir a configuração do número máximo de requisições permitidas por segundo.
O rate limiter deve ter ter a opção de escolher o tempo de bloqueio do IP ou do Token caso a quantidade de requisições tenha sido excedida.
As configurações de limite devem ser realizadas via variáveis de ambiente ou em um arquivo “.env” na pasta raiz.
Deve ser possível configurar o rate limiter tanto para limitação por IP quanto por token de acesso.
O sistema deve responder adequadamente quando o limite é excedido:
    Código HTTP: 429
    Mensagem: you have reached the maximum number of requests or actions allowed within a certain time frame
Todas as informações de "limiter” devem ser armazenadas e consultadas de um banco de dados Redis. Você pode utilizar docker-compose para subir o Redis.
Crie uma “strategy” que permita trocar facilmente o Redis por outro mecanismo de persistência.
A lógica do limiter deve estar separada do middleware.

Exemplos:

Limitação por IP: Suponha que o rate limiter esteja configurado para permitir no máximo 5 requisições por segundo por IP. Se o IP 192.168.1.1 enviar 6 requisições em um segundo, a sexta requisição deve ser bloqueada.
Limitação por Token: Se um token abc123 tiver um limite configurado de 10 requisições por segundo e enviar 11 requisições nesse intervalo, a décima primeira deve ser bloqueada.
Nos dois casos acima, as próximas requisições poderão ser realizadas somente quando o tempo total de expiração ocorrer. Ex: Se o tempo de expiração é de 5 minutos, determinado IP poderá realizar novas requisições somente após os 5 minutos.

Dicas:

Teste seu rate limiter sob diferentes condições de carga para garantir que ele funcione conforme esperado em situações de alto tráfego.

Entrega:

O código-fonte completo da implementação.
Documentação explicando como o rate limiter funciona e como ele pode ser configurado.
Testes automatizados demonstrando a eficácia e a robustez do rate limiter.
Utilize docker/docker-compose para que possamos realizar os testes de sua aplicação.
O servidor web deve responder na porta 8080.

Desafio Go: Rate Limiter

Rate limiter é uma estratégia para limitar o tráfego de rede. Ela limita a frequência com que alguém pode repetir uma ação dentro de um determinado período de tempo – por exemplo, tentar fazer login em uma conta. A limitação de taxa pode ajudar a parar certos tipos de atividades de bots maliciosas. Também pode reduzir a tensão nos servidores web. No entanto, a limitação de taxa não é uma solução completa para gerenciar as atividades de bots.

Funcionamento

O rate limiter implementado neste projeto utiliza Redis para armazenar e controlar as requisições. Ele suporta limitação baseada em IP e também em tokens de acesso únicos. Como funciona:

  • IP Rate Limiting: Limita a quantidade de requisições por segundo de um mesmo endereço IP.
  • Token Rate Limiting: Permite configurar limites específicos para diferentes tokens de acesso, cada um com seu próprio tempo de expiração e contagem de requisições.

Configuração

Pré-requisitos

  • Docker
  • Makefile
  • Go
  • Curl

Resolução

Foi criado um arquivo Makefile para facilitar o processo de provisionamento de ferramentas, executar o deploy e os testes que representam a resolução do desafio

Na pasta raiz basta executar o comando que todo processo será iniciado make desafio

Uso

  • API_KEY: Para autenticar as requisições, adicione um cabeçalho API_KEY com o token correto. Exemplo: curl -H "API_KEY: token1" http://localhost:8080/.

Teste

  • Após iniciar o servidor, teste o rate limiter utilizando ferramentas como cURL para verificar se as requisições estão sendo limitadas conforme configurado.