Rate Limiting en C# (.NET) : guide complet de la bibliothèque System.Threading.RateLimiting
\n\nDans 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.
Qu'est-ce que System.Threading.RateLimiting ?
\nSystem.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.
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
Stratégies intégrées de Rate Limiting
\nLa bibliothèque prend en charge quatre stratégies principales :
\n\n1. Fenêtre fixe (Fixed Window)
\nLes 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.
\nusing 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\n2. Fenêtre glissante (Sliding Window)
\nSimilaire à la fenêtre fixe, mais la fenêtre « glisse » à chaque requête, offrant une limitation plus progressive. Elle est divisée en segments.
\nvar 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\n3. Seau à jetons (Token Bucket)
\nL'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.
\nvar 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\n4. Pipeline (Concurrency Limiter)
\nLimite le nombre de requêtes exécutées simultanément. Utile pour gérer le parallélisme plutôt que le débit.
\nvar concurrencyOptions = new ConcurrencyLimiterOptions\n{\n PermitLimit = 5,\n QueueLimit = 10\n};\n\nvar concurrencyLimiter = new ConcurrencyLimiter(concurrencyOptions);\n\nUtilisation 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 Aussi dans la bibliothèque
Parsing HTML en Go (Golang) : bibliothèques et exemples de code
Migrations de bases de données dans Node.js : Sequelize, Knex et TypeORM
Travailler avec XML en C++ : bibliothèques pugixml, TinyXML-2 et RapidXML
Validation des données en TypeScript : bibliothèques, approches et exemples de code