Rate Limiting en C# (.NET) : Guide complet 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) : Bibliothèque System.Threading.RateLimiting



Le rate limiting (limitation de la vitesse des requêtes) est un mécanisme essentiel pour protéger les API, les microservices et les applications web contre les surcharges, les attaques DDoS et la consommation incontrôlée des ressources. Dans l'écosystème .NET, à partir de .NET 7, une bibliothèque intégrée System.Threading.RateLimiting est apparue, offrant des outils flexibles et performants pour implémenter diverses stratégies de limitation.



Qu'est-ce que le Rate Limiting et pourquoi est-il nécessaire ?

Le rate limiting permet de contrôler le nombre d'opérations (requêtes, appels de méthodes, transactions) sur une période donnée. Principaux cas d'utilisation :

  • Protection des API publiques — prévention des abus de la part des clients.
  • Stabilisation du backend — répartition uniforme de la charge sur les bases de données et les services externes.
  • Économie de ressources — limitation des appels aux API tierces payantes.
  • Respect des SLA — garantie d'un accès équitable pour tous les utilisateurs.


Composants principaux de la bibliothèque System.Threading.RateLimiting

La bibliothèque est construite autour de la classe abstraite RateLimiter et de plusieurs implémentations prêtes à l'emploi :



1. TokenBucketRateLimiter (Algorithme du "Seau de jetons")

Algorithme classique qui accumule des jetons à une vitesse donnée (taux de réapprovisionnement) et permet de les utiliser selon les besoins. Idéal pour lisser les pics de charge.

using System.Threading.RateLimiting;

var limiter = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions{ TokenLimit = 100, // Nombre maximum de jetons TokensPerPeriod = 20, // Nombre de jetons ajoutés par période ReplenishmentPeriod = TimeSpan.FromSeconds(1), // Période de réapprovisionnement QueueLimit = 10, // Taille maximale de la file d'attente QueueProcessingOrder = QueueProcessingOrder.OldestFirst});

// Exemple d'utilisationusing var lease = await limiter.AcquireAsync(cancellationToken: CancellationToken.None);if (lease.IsAcquired){ // Effectuer l'opération Console.WriteLine("Jeton obtenu");}else{ // Gérer le refus Console.WriteLine("Limite dépassée, réessayez plus tard");}


2. ConcurrencyLimiter (Limitation de la concurrence)

Limite le nombre d'opérations simultanées. Idéal pour contrôler l'accès aux ressources limitées (pools de connexions, descripteurs de fichiers).

var concurrencyLimiter = new ConcurrencyLimiter(new ConcurrencyLimiterOptions{    PermitLimit = 10,           // Maximum 10 requêtes simultanées    QueueLimit = 5,             // File d'attente jusqu'à 5 requêtes    QueueProcessingOrder = QueueProcessingOrder.NewestFirst});

// Utilisation dans un contexte asynchroneasync Task ProcessRequestAsync(){ using var lease = await concurrencyLimiter.AcquireAsync(); if (lease.IsAcquired) { // Exécuter une tâche gourmande en ressources await Task.Delay(1000); }}


3. FixedWindowRateLimiter (Fenêtre fixe)

L'algorithme le plus simple : autorise N opérations sur un intervalle de temps fixe (par exemple, 100 requêtes par minute). Après la fin de la fenêtre, le compteur est réinitialisé.

var fixedWindow = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions{    PermitLimit = 60,               // 60 requêtes    Window = TimeSpan.FromMinutes(1), // en 1 minute    QueueLimit = 0,                 // Sans file d'attente    AutoReplenishment = true        // Réinitialisation automatique de la fenêtre});

// Vérification de la limiteRateLimitLease lease = fixedWindow.AttemptAcquire();if (lease.IsAcquired){ Console.WriteLine($"Tentatives restantes : {lease.GetAllMetadata()}");}


4. SlidingWindowRateLimiter (Fenêtre glissante)

Bo

Recommendations