Limitación de Tasa en C# (.NET): Biblioteca System.Threading.RateLimiting
La limitación de tasa (rate limiting) es un mecanismo críticamente importante para proteger API, microservicios y aplicaciones web contra sobrecargas, ataques DDoS y consumo descontrolado de recursos. En el ecosistema .NET, a partir de .NET 7, apareció la biblioteca integrada System.Threading.RateLimiting, que proporciona herramientas flexibles y de alto rendimiento para implementar diversas estrategias de limitación.
¿Qué es la Limitación de Tasa y por qué es necesaria?
La limitación de tasa permite controlar la cantidad de operaciones (solicitudes, llamadas a métodos, transacciones) en un período de tiempo determinado. Los principales casos de uso son:
- Protección de API públicas — prevención de abusos por parte de los clientes.
- Estabilización del backend — distribución uniforme de la carga en bases de datos y servicios externos.
- Ahorro de recursos — limitación de llamadas a API de terceros de pago.
- Cumplimiento de SLA — garantía de acceso equitativo para todos los usuarios.
Componentes principales de la biblioteca System.Threading.RateLimiting
La biblioteca se basa en la clase abstracta RateLimiter y varias implementaciones listas para usar:
1. TokenBucketRateLimiter (Algoritmo "Cubo de Tokens")
Algoritmo clásico que acumula tokens a una velocidad determinada (tasa de reposición) y permite usarlos según sea necesario. Ideal para suavizar picos de carga.
using System.Threading.RateLimiting;
var limiter = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions{ TokenLimit = 100, // Cantidad máxima de tokens TokensPerPeriod = 20, // Cuántos tokens se agregan por período ReplenishmentPeriod = TimeSpan.FromSeconds(1), // Período de reposición QueueLimit = 10, // Tamaño máximo de la cola de espera QueueProcessingOrder = QueueProcessingOrder.OldestFirst});
// Ejemplo de usousing var lease = await limiter.AcquireAsync(cancellationToken: CancellationToken.None);if (lease.IsAcquired){ // Ejecutar la operación Console.WriteLine("Token obtenido");}else{ // Manejar la denegación Console.WriteLine("Límite excedido, intente más tarde");}2. ConcurrencyLimiter (Limitación de Concurrencia)
Limita la cantidad de operaciones simultáneas. Ideal para controlar el acceso a recursos limitados (grupos de conexiones, descriptores de archivos).
var concurrencyLimiter = new ConcurrencyLimiter(new ConcurrencyLimiterOptions{ PermitLimit = 10, // Máximo 10 solicitudes simultáneas QueueLimit = 5, // Cola de espera de hasta 5 solicitudes QueueProcessingOrder = QueueProcessingOrder.NewestFirst});
// Uso en contexto asíncronoasync Task ProcessRequestAsync(){ using var lease = await concurrencyLimiter.AcquireAsync(); if (lease.IsAcquired) { // Ejecutar tarea que consume recursos await Task.Delay(1000); }}3. FixedWindowRateLimiter (Ventana Fija)
El algoritmo más simple: permite N operaciones en un intervalo de tiempo fijo (por ejemplo, 100 solicitudes por minuto). Al finalizar la ventana, el contador se reinicia.
var fixedWindow = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions{ PermitLimit = 60, // 60 solicitudes Window = TimeSpan.FromMinutes(1), // en 1 minuto QueueLimit = 0, // Sin cola AutoReplenishment = true // Reinicio automático de la ventana});
// Verificación del límiteRateLimitLease lease = fixedWindow.AttemptAcquire();if (lease.IsAcquired){ Console.WriteLine($"Intentos restantes: {lease.GetAllMetadata()}");}4. SlidingWindowRateLimiter (Ventana Deslizante)
Bo
También en la biblioteca
Configuración de aplicaciones en Go: mejores prácticas y herramientas
ASP.NET Core para C# (.NET): guía completa con ejemplos
AngleSharp para C# (.NET): guía completa con ejemplos
TypeScript conditional-type-checks: guía completa con ejemplos