Rate Limiting en C# (.NET) : guide de la bibliothèque System.Threading.RateLimiting

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Rate Limiting en C# (.NET) : guide complet de la bibliothèque System.Threading.RateLimiting

\n\n

Dans les applications web modernes et les microservices, il est essentiel de contrôler la charge sur les ressources. Rate Limiting (limitation du débit des requêtes) est un mécanisme qui empêche l'utilisation excessive des API, bases de données ou autres composants. Dans l'écosystème .NET, la bibliothèque intégrée System.Threading.RateLimiting est apparue, offrant des outils flexibles et performants pour implémenter le rate limiting. Dans cet article, nous analyserons en détail ses fonctionnalités, son architecture et des exemples d'utilisation.

\n\n

Qu'est-ce que System.Threading.RateLimiting ?

\n

System.Threading.RateLimiting est une bibliothèque incluse dans .NET 7 et versions ultérieures. Elle fournit des abstractions et des implémentations pour différentes stratégies de limitation de débit. La classe principale est RateLimiter, qui gère l'accès à une ressource, en autorisant ou en refusant les requêtes selon des règles définies.

\n\n

Concepts fondamentaux

\n
    \n
  • RateLimiter — classe de base dont héritent toutes les implémentations.
  • \n
  • Acquire / TryAcquire — méthodes synchrones pour obtenir une autorisation.
  • \n
  • AcquireAsync / WaitAsync — méthodes asynchrones permettant d'attendre la libération de la limite.
  • \n
  • Metadata — informations supplémentaires sur la limite (par exemple, temps avant réinitialisation).
  • \n
\n\n

Stratégies intégrées de Rate Limiting

\n

La bibliothèque prend en charge quatre stratégies principales :

\n\n

1. Fenêtre fixe (Fixed Window)

\n

Les requêtes sont regroupées par fenêtres temporelles de durée fixe. Si la limite est dépassée, les requêtes sont refusées jusqu'au début de la fenêtre suivante.

\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($"Requête {i} exécutée");\n    }\n    else\n    {\n        Console.WriteLine($"Requête {i} refusée");\n    }\n}
\n\n

2. Fenêtre glissante (Sliding Window)

\n

Similaire à la fenêtre fixe, mais la fenêtre « glisse » à chaque requête, offrant une limitation plus progressive. Elle est divisée en segments.

\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. Seau à jetons (Token Bucket)

\n

L'un des algorithmes les plus populaires. Le seau contient un nombre déterminé de « jetons ». Les jetons sont ajoutés à une vitesse définie. Une requête consomme un ou plusieurs jetons. Si le seau est vide, la requête attend ou est refusée.

\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. Pipeline (Concurrency Limiter)

\n

Limite le nombre de requêtes exécutées simultanément. Utile pour gérer le parallélisme plutôt que le débit.

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

Utilisation de RateLimiter dans ASP.NET Core

\n

À partir de .NET 7, le rate limiting peut être facilement intégré dans le middleware ASP.NET Core. Enregistrement des services et configuration des politiques :

\n
// Program.cs\nbuilder.Servi                    

Recommendations