Limiteurs de débit de base dans le RateLimiter universel .NET : Architecture et algorithmes
Le composant de limitation de débit universel .NET inclut quatre limiteurs algorithmiques de base : FixedWindowRateLimiter, SlidingWindowRateLimiter, TokenBucketRateLimiter et ConcurrencyLimiter. Le premier implémente une fenêtre fixe, le second une fenêtre glissante, le troisième un seau de jetons, et le quatrième limite la concurrence.
Les classes de limiteur de débit héritent de ReplenishingRateLimiter, qui définit la logique de réapprovisionnement des permis via un minuteur. ConcurrencyLimiter hérite directement de RateLimiter. Les constructeurs acceptent des paramètres de configuration, qui sont stockés dans une copie de Options.
Toutes implémentent AttemptAcquireCore (synchrone), AcquireAsyncCore (asynchrone), Dispose/DisposeAsync. Les limiteurs de débit ajoutent également ReplenishInternal.
Gestion des demandes de permis
Les demandes sont divisées en demandes d’essai (permitCount = 0) et demandes réelles (permitCount > 0). Les valeurs négatives déclenchent une ArgumentOutOfRangeException.
Algorithme de traitement :
- Vérifier que permitCount ≤ AutoReplenishment.MaxPermits.
- Pour les demandes d’essai : si availablePermits > 0 — succès immédiat.
- Acquérir un verrou sur la deque de la file.
- Si availablePermits ≥ permitCount — accorder les permis, décrémenter et relâcher le verrou.
- Sinon : rejet synchrone ou ajout à la file (asynchrone).
La méthode asynchrone retourne ValueTask<RateLimitLease>. En cas de débordement de la file — rejet.
Structure de la file pour les demandes
La file est une deque<RequestRegistration>, où RequestRegistration hérite de TaskCompletionSource<RateLimitLease>.
Paramètres de la file dans Options :
- QueueLimit : somme maximale de permitCount dans la file.
- QueueProcessingOrder : OldestFirst (FIFO, par défaut) ou NewestFirst (LIFO).
Taille actuelle : _queueTotalPermits. Verrouillage sur deque.
Lors du réapprovisionnement des permis : extraire de la file, compléter la tâche avec un Lease réussi, décrémenter _queueTotalPermits.
Retour des leases et statistiques
Les méthodes retournent des dérivés de RateLimitLease :
- FixedWindowLease, SlidingWindowLease, TokenBucketLease (similaires).
- ConcurrencyLease (différent).
Compteurs : _successfulAcquires, _failedAcquires (Interlocked.Increment).
RateLimiterStatistics fournit :
- AvailablePermits.
- CurrentQueueLength.
- Compteurs.
La propriété IdleDuration suit le temps passé inactif sans demandes.
Fonctionnalités de chaque limiteur
FixedWindowRateLimiter
Fenêtre fixe : les permis sont réapprovisionnés au début de la fenêtre (permitPeriod).
_availablePermits est réinitialisé à MaxPermits.
SlidingWindowRateLimiter
Fenêtre glissante : suit l’historique sur SlidingWindowSize segments (segmentSize = permitPeriod / SlidingWindowSize).
Restaure en se basant sur les segments précédents.
TokenBucketRateLimiter
Seau de jetons : _tokens réapprovisionnés toutes les ReplenishmentPeriod, débit = TokensPerPeriod.
Limite la dépense en fonction de refillAmount.
ConcurrencyLimiter
Limite _currentConcurrency ≤ PermitLimit.
La file lance les tâches à la fin des actives (OnCompleted).
Points clés
- Polyvalence : les limiteurs de base forment la fondation de la limitation de débit ASP.NET Core et sont applicables hors contextes web.
- File : supporte FIFO/LIFO, limite par somme totale de permis, exécution asynchrone.
- Demandes d’essai : permitCount=0 pour vérifier sans consommation.
- Statistiques : compteurs atomiques + métriques en temps réel.
- Réapprovisionnement : piloté par minuteur pour tous les ReplenishingRateLimiter.
— Editorial Team
Aucun commentaire pour le moment.