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
Também na biblioteca
Geolocalização e Mapas em TypeScript: bibliotecas e exemplos práticos
Trabalhando com Excel em C# (.NET): Bibliotecas EPPlus e ClosedXML
Cliente Elasticsearch para Kotlin: integração, exemplos e recursos