Como usar “rate limit” em sua API no .NET 7
O .NET 7 possui um middleware para limitação da taxa de acesso às API´s, ele é implementado pela biblioteca Microsoft.AspNetCore.RateLimiting onde podemos limitar a quantidade de requisições que uma API está apta a aceitar num período de tempo a ser estabelecido.
De acordo com a documentação, temos várias formas de implementar este tipo de limitador, sendo:
-Janela fixa — utiliza uma janela de tempo fixa para controlar as limitações
-Janela deslizante — utiliza uma janela de tempo deslizante, dividindo em segmentos e reciclando solicitações não utilizadas
-Bucket de Token — similar ao anterior, mas um número fixo de tokens é adicionado a cada período de reabastecimento.
-Simultaneidade — limita o número de solicitações simultâneas.
Vamos implementar então um limitador de janela fixa somente para demonstrar a possibilidade de implementação em qualquer aplicação .Net 7.
Para implementação, basta colocar o código abaixo no program.cs.
E incluir esta linha na parte inferior assim que tiver criado o objeto app
Depois de feita esta implementação, basta colocar os comandos no seu endpoint (quando usando Minimal Api).
Após implementar a limitação, fiz 5 requisições para ultrapassar o limite implementado, com isto recebi a mensagem de erro conforme demonstrado abaixo, com erro 429:
Neste exemplo, podemos incluir uma fila de espera, onde a requisição não devolve erro caso haja 3 requisições na fila, resultando erro apenas se excederem este limite.
Basta que seja informado o nome da política “period3” no mapeamento do endpoint.
Executando o exemplo anterior, vemos que o tempo de execução depois de atingir o limite foi bem maior, por que ela foi colocada na fila e esperou que a janela de execução finalizasse para devolver a resposta.
Otimizando
E para finalizar para que nossa inicialização não fique desorganizada e cheia de código, vamos aplicar um extension method para deixar o código limpo no program.cs ficando uma simples linha.
Crie uma classe estática e faça referência à ela como feito abaixo para que possa funcionar da forma como foi demonstrada na inicialização.
Assim o código fica muito mais legível e colocamos cada coisa no seu lugar !
Criando uma classe para guardar nossas extensões de inicialização !
Gostou do artigo? clique no ícone👏e me siga para ver as próximas publicações !!