Rate Limiting em C# (.NET): guia 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): guia completo da biblioteca System.Threading.RateLimiting

\n\n

Em aplicações web modernas e microsserviços, é fundamental controlar a carga sobre os recursos. Rate Limiting (limitação de velocidade de requisições) é um mecanismo que previne o uso excessivo de APIs, bancos de dados ou outros componentes. No ecossistema .NET, surgiu a biblioteca nativa System.Threading.RateLimiting, que oferece ferramentas flexíveis e performáticas para implementar rate limiting. Neste artigo, vamos detalhar seus recursos, arquitetura e exemplos de uso.

\n\n

O que é System.Threading.RateLimiting?

\n

System.Threading.RateLimiting é uma biblioteca que faz parte do .NET 7 e versões superiores. Ela fornece abstrações e implementações para diferentes estratégias de limitação de velocidade. A classe principal é RateLimiter, que gerencia o acesso a um recurso, permitindo ou rejeitando requisições com base em regras definidas.

\n\n

Conceitos principais

\n
    \n
  • RateLimiter — classe base da qual todas as implementações herdam.
  • \n
  • Acquire / TryAcquire — métodos síncronos para obter permissão.
  • \n
  • AcquireAsync / WaitAsync — métodos assíncronos que permitem aguardar a liberação do limite.
  • \n
  • Metadata — informações adicionais sobre o limite (ex.: tempo até o reset).
  • \n
\n\n

Estratégias nativas de Rate Limiting

\n

A biblioteca suporta quatro estratégias principais:

\n\n

1. Janela Fixa (Fixed Window)

\n

As requisições são agrupadas em janelas temporais de duração fixa. Se o limite for excedido, as requisições são rejeitadas até o início da próxima janela.

\n
using System.Threading.RateLimiting;\n\nvar options = new FixedWindowRateLimiterOptions\n{\n    PermitLimit = 10,\n    Window = TimeSpan.FromSeconds(1),\n    QueueProcessingOrder = QueueProcessingOrder.OldestFirst,\n    QueueLimit = 0\n};\n\nvar limiter = new FixedWindowRateLimiter(options);\n\nfor (int i = 0; i < 15; i++)\n{\n    using var lease = await limiter.AcquireAsync();\n    if (lease.IsAcquired)\n    {\n        Console.WriteLine($"Requisição {i} executada");\n    }\n    else\n    {\n        Console.WriteLine($"Requisição {i} rejeitada");\n    }\n}
\n\n

2. Janela Deslizante (Sliding Window)

\n

Semelhante à janela fixa, mas a janela "desliza" a cada requisição, proporcionando uma limitação mais suave. É dividida em segmentos (segment).

\n
var slidingOptions = new SlidingWindowRateLimiterOptions\n{\n    PermitLimit = 10,\n    Window = TimeSpan.FromSeconds(1),\n    SegmentsPerWindow = 4,\n    QueueLimit = 0\n};\n\nvar slidingLimiter = new SlidingWindowRateLimiter(slidingOptions);
\n\n

3. Token Bucket

\n

Um dos algoritmos mais populares. O bucket contém uma quantidade definida de "tokens". Tokens são adicionados a uma taxa especificada. Cada requisição consome um ou mais tokens. Se o bucket estiver vazio, a requisição aguarda ou é rejeitada.

\n
var tokenOptions = new TokenBucketRateLimiterOptions\n{\n    TokenLimit = 100,\n    QueueLimit = 0,\n    ReplenishmentPeriod = TimeSpan.FromSeconds(1),\n    TokensPerPeriod = 10,\n    AutoReplenishment = true\n};\n\nvar tokenLimiter = new TokenBucketRateLimiter(tokenOptions);
\n\n

4. Limitador de Concorrência (Concurrency Limiter)

\n

Limita o número de requisições executadas simultaneamente. Útil para gerenciar concorrência, em vez de velocidade.

\n
var concurrencyOptions = new ConcurrencyLimiterOptions\n{\n    PermitLimit = 5,\n    QueueLimit = 10\n};\n\nvar concurrencyLimiter = new ConcurrencyLimiter(concurrencyOptions);
\n\n

Usando RateLimiter no ASP.NET Core

\n

A partir do .NET 7, o rate limiting pode ser facilmente integrado ao middleware do ASP.NET Core. Registro de serviços e configuração de políticas:

\n
// Program.cs\nbuilder.Servi                    

Recommendations