Volver al inicio

RateLimiter básico .NET: algoritmos y colas

El artículo desglosa los limitadores algorítmicos básicos del RateLimiter universal en .NET: FixedWindow, SlidingWindow, TokenBucket y ConcurrencyLimiter. Describe el procesamiento de solicitudes, colas FIFO/LIFO, Lease y estadísticas. Material para desarrolladores senior.

Arquitectura de los limitadores básicos de RateLimiter en .NET
Advertisement 728x90

# # Limitadores de Tasa Básicos en el RateLimiter Universal de .NET: Arquitectura y Algoritmos

El componente universal de limitación de tasa de .NET incluye cuatro limitadores algorítmicos básicos: FixedWindowRateLimiter, SlidingWindowRateLimiter, TokenBucketRateLimiter y ConcurrencyLimiter. El primero implementa una ventana fija, el segundo una ventana deslizante, el tercero un cubo de tokens y el cuarto limita la concurrencia.

Las clases de limitadores de tasa heredan de ReplenishingRateLimiter, que define la lógica para reponer permisos mediante un temporizador. ConcurrencyLimiter hereda directamente de RateLimiter. Los constructores aceptan parámetros de configuración, que se almacenan en una copia de Options.

Todas implementan AttemptAcquireCore (síncrono), AcquireAsyncCore (asíncrono), Dispose/DisposeAsync. Los limitadores de tasa también agregan ReplenishInternal.

Google AdInline article slot

Manejo de Solicitudes de Permisos

Las solicitudes se dividen en solicitudes de prueba (permitCount = 0) y solicitudes reales (permitCount > 0). Los valores negativos generan ArgumentOutOfRangeException.

Algoritmo de procesamiento:

  • Verificar que permitCount ≤ AutoReplenishment.MaxPermits.
  • Para solicitudes de prueba: si availablePermits > 0 — éxito inmediato.
  • Adquirir bloqueo en el deque de la cola.
  • Si availablePermits ≥ permitCount — otorgar permisos, decrementar y liberar bloqueo.
  • De lo contrario: rechazo síncrono o agregar a la cola (asíncrono).

El método asíncrono devuelve ValueTask<RateLimitLease>. En caso de desbordamiento de la cola — rechazo.

Google AdInline article slot

Estructura de la Cola para Solicitudes

La cola es un deque<RequestRegistration>, donde RequestRegistration hereda de TaskCompletionSource<RateLimitLease>.

Configuraciones de cola en Options:

  • QueueLimit: suma máxima de permitCount en la cola.
  • QueueProcessingOrder: OldestFirst (FIFO, predeterminado) o NewestFirst (LIFO).

Tamaño actual: _queueTotalPermits. Bloqueo en deque.

Google AdInline article slot

Al reponer permisos: Desencolar, CompleteTask con Lease exitoso, decrementar _queueTotalPermits.

Devolución de Leases y Estadísticas

Los métodos devuelven derivados de RateLimitLease:

  • FixedWindowLease, SlidingWindowLease, TokenBucketLease (similares).
  • ConcurrencyLease (diferente).

Contadores: _successfulAcquires, _failedAcquires (Interlocked.Increment).

RateLimiterStatistics proporciona:

  • AvailablePermits.
  • CurrentQueueLength.
  • Contadores.

La propiedad IdleDuration rastrea el tiempo inactivo sin solicitudes.

Características de Cada Limitador

FixedWindowRateLimiter

Ventana fija: los permisos se reponen al inicio de la ventana (permitPeriod).

_availablePermits se restablece a MaxPermits.

SlidingWindowRateLimiter

Ventana deslizante: rastrea historial en SlidingWindowSize segmentos (segmentSize = permitPeriod / SlidingWindowSize).

Restaura en base a segmentos anteriores.

TokenBucketRateLimiter

Cubo de tokens: _tokens se reponen cada ReplenishmentPeriod, tasa = TokensPerPeriod.

Limita el gasto en base a refillAmount.

ConcurrencyLimiter

Limita _currentConcurrency ≤ PermitLimit.

La cola lanza tareas al completarse las activas (OnCompleted).

Puntos Clave

  • Versatilidad: los limitadores básicos forman la base de la limitación de tasa de ASP.NET Core y son aplicables fuera de contextos web.
  • Cola: soporta FIFO/LIFO, límite por suma total de permisos, ejecución asíncrona.
  • Solicitudes de prueba: permitCount=0 para verificar sin consumir.
  • Estadísticas: contadores atómicos + métricas en tiempo real.
  • Reposición: impulsada por temporizador para todos ReplenishingRateLimiter.

— Editorial Team

Advertisement 728x90

Leer después