Retour à l'accueil

RateLimiter .NET de base : algorithmes et files d'attente

L'article décompose les limiteurs algorithmiques de base du RateLimiter universel en .NET : FixedWindow, SlidingWindow, TokenBucket et ConcurrencyLimiter. Décrit le traitement des requêtes, files d'attente FIFO/LIFO, Lease et statistiques. Matériel pour développeurs seniors.

Architecture des limiteurs RateLimiter de base en .NET
Advertisement 728x90

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.

Google AdInline article slot

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.

Google AdInline article slot

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.

Google AdInline article slot

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

Advertisement 728x90

Lire ensuite