Limitación de Tasa en C# (.NET): guía 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): guía completa de la biblioteca System.Threading.RateLimiting

\n\n

En las aplicaciones web modernas y los microservicios, es fundamental controlar la carga sobre los recursos. Rate Limiting (limitación de velocidad de solicitudes) es un mecanismo que previene el uso excesivo de APIs, bases de datos u otros componentes. En el ecosistema .NET ha aparecido la biblioteca integrada System.Threading.RateLimiting, que proporciona herramientas flexibles y eficientes para implementar la limitación de tasa. En este artículo analizaremos en detalle sus capacidades, arquitectura y ejemplos de uso.

\n\n

¿Qué es System.Threading.RateLimiting?

\n

System.Threading.RateLimiting es una biblioteca que forma parte de .NET 7 y versiones posteriores. Proporciona abstracciones e implementaciones para diversas estrategias de limitación de velocidad. La clase principal es RateLimiter, que gestiona el acceso a un recurso, permitiendo o rechazando solicitudes según las reglas definidas.

\n\n

Conceptos principales

\n
    \n
  • RateLimiter — clase base de la que heredan todas las implementaciones.
  • \n
  • Acquire / TryAcquire — métodos síncronos para obtener permiso.
  • \n
  • AcquireAsync / WaitAsync — métodos asíncronos que permiten esperar la liberación del límite.
  • \n
  • Metadata — información adicional sobre el límite (por ejemplo, tiempo hasta el reinicio).
  • \n
\n\n

Estrategias integradas de Rate Limiting

\n

La biblioteca admite cuatro estrategias principales:

\n\n

1. Ventana fija (Fixed Window)

\n

Las solicitudes se agrupan en ventanas de tiempo de longitud fija. Si se excede el límite, las solicitudes se rechazan hasta el inicio de la siguiente ventana.

\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($"Solicitud {i} ejecutada");\n    }\n    else\n    {\n        Console.WriteLine($"Solicitud {i} rechazada");\n    }\n}
\n\n

2. Ventana deslizante (Sliding Window)

\n

Similar a la ventana fija, pero la ventana se «desliza» con cada solicitud, proporcionando una limitación más suave. Se divide en segmentos.

\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 (Token Bucket)

\n

Uno de los algoritmos más populares. El bucket contiene una cantidad determinada de «tokens». Los tokens se agregan a una velocidad determinada. Cada solicitud consume uno o varios tokens. Si el bucket está vacío, la solicitud espera o es rechazada.

\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. Canalización (Concurrency Limiter)

\n

Limita la cantidad de solicitudes que se ejecutan simultáneamente. Es útil para gestionar la concurrencia, no la velocidad.

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

Uso de RateLimiter en ASP.NET Core

\n

A partir de .NET 7, la limitación de tasa se puede integrar fácilmente en el middleware de ASP.NET Core. Registro de servicios y configuración de políticas:

\n
// Program.cs\nbuilder.Servi                    

Recommendations