Rate Limiting em C# (.NET): guia completo da biblioteca System.Threading.RateLimiting
\n\nEm 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.
O que é System.Threading.RateLimiting?
\nSystem.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.
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
Estratégias nativas de Rate Limiting
\nA biblioteca suporta quatro estratégias principais:
\n\n1. Janela Fixa (Fixed Window)
\nAs 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.
\nusing 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\n2. Janela Deslizante (Sliding Window)
\nSemelhante à janela fixa, mas a janela "desliza" a cada requisição, proporcionando uma limitação mais suave. É dividida em segmentos (segment).
\nvar 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\n3. Token Bucket
\nUm 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.
\nvar 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\n4. Limitador de Concorrência (Concurrency Limiter)
\nLimita o número de requisições executadas simultaneamente. Útil para gerenciar concorrência, em vez de velocidade.
\nvar concurrencyOptions = new ConcurrencyLimiterOptions\n{\n PermitLimit = 5,\n QueueLimit = 10\n};\n\nvar concurrencyLimiter = new ConcurrencyLimiter(concurrencyOptions);\n\nUsando RateLimiter no ASP.NET Core
\nA 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 Também na biblioteca
Programação Reativa em C++: bibliotecas RxCpp e Boost.Signals2
Configuração de aplicações em Rust: bibliotecas config e dotenv
Monitoramento de aplicações Rust: biblioteca tracing e métricas
Trabalhando com CSV em TypeScript: bibliotecas, parsing e geração de dados