Limitación de Tasa en C# (.NET): Guía Completa de la Biblioteca System.Threading.RateLimiting

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations