Rate Limiting em C# (.NET): Guia Completo da Biblioteca System.Threading.RateLimiting

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Rate Limiting em C# (.NET): Biblioteca System.Threading.RateLimiting



Rate limiting (limitação de velocidade de requisições) é um mecanismo criticamente importante para proteger APIs, microsserviços e aplicações web contra sobrecargas, ataques DDoS e consumo descontrolado de recursos. No ecossistema .NET, a partir do .NET 7, surgiu a biblioteca nativa System.Threading.RateLimiting, que oferece ferramentas flexíveis e performáticas para implementar diversas estratégias de limitação.



O que é Rate Limiting e para que serve?

Rate limiting permite controlar a quantidade de operações (requisições, chamadas de métodos, transações) em um determinado intervalo de tempo. Principais cenários de uso:

  • Proteção de APIs públicas — prevenção de abusos por parte de clientes.
  • Estabilização do backend — distribuição uniforme da carga em bancos de dados e serviços externos.
  • Economia de recursos — limitação de chamadas a APIs de terceiros pagas.
  • Garantia de SLA — assegurar acesso igualitário para todos os usuários.


Componentes principais da biblioteca System.Threading.RateLimiting

A biblioteca é construída em torno da classe abstrata RateLimiter e de várias implementações prontas:



1. TokenBucketRateLimiter (Algoritmo "Balde de Tokens")

Algoritmo clássico que acumula tokens a uma taxa definida (taxa de reposição) e permite usá-los conforme necessário. Ideal para suavizar picos de carga.

using System.Threading.RateLimiting;

var limiter = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions{ TokenLimit = 100, // Número máximo de tokens TokensPerPeriod = 20, // Quantos tokens são adicionados por período ReplenishmentPeriod = TimeSpan.FromSeconds(1), // Período de reposição QueueLimit = 10, // Tamanho máximo da fila de espera QueueProcessingOrder = QueueProcessingOrder.OldestFirst});

// Exemplo de usousing var lease = await limiter.AcquireAsync(cancellationToken: CancellationToken.None);if (lease.IsAcquired){ // Executar a operação Console.WriteLine("Token obtido");}else{ // Tratar a recusa Console.WriteLine("Limite excedido, tente novamente mais tarde");}


2. ConcurrencyLimiter (Limitação de concorrência)

Limita o número de operações simultâneas. Ideal para controlar o acesso a recursos limitados (pools de conexão, descritores de arquivo).

var concurrencyLimiter = new ConcurrencyLimiter(new ConcurrencyLimiterOptions{    PermitLimit = 10,           // Máximo de 10 requisições simultâneas    QueueLimit = 5,             // Fila de espera de até 5 requisições    QueueProcessingOrder = QueueProcessingOrder.NewestFirst});

// Uso em contexto assíncronoasync Task ProcessRequestAsync(){ using var lease = await concurrencyLimiter.AcquireAsync(); if (lease.IsAcquired) { // Executar tarefa que consome muitos recursos await Task.Delay(1000); }}


3. FixedWindowRateLimiter (Janela fixa)

O algoritmo mais simples: permite N operações em um intervalo de tempo fixo (ex.: 100 requisições por minuto). Após o término da janela, o contador é zerado.

var fixedWindow = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions{    PermitLimit = 60,               // 60 requisições    Window = TimeSpan.FromMinutes(1), // em 1 minuto    QueueLimit = 0,                 // Sem fila    AutoReplenishment = true        // Reinicialização automática da janela});

// Verificação do limiteRateLimitLease lease = fixedWindow.AttemptAcquire();if (lease.IsAcquired){ Console.WriteLine($"Tentativas restantes: {lease.GetAllMetadata()}");}


4. SlidingWindowRateLimiter (Janela deslizante)

Bol

Recommendations