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
Aussi dans la bibliothèque
Envoi de SMS en C# (.NET) : Intégration avec l'API des services SMS via HttpClient
Respect/Validation PHP : guide complet avec exemples
Journalisation en Kotlin : aperçu des meilleures bibliothèques et solutions