Zurück zur Startseite

Grundlegender RateLimiter .NET: Algorithmen und Warteschlangen

Der Artikel zerlegt die grundlegenden algorithmischen Limiter des universellen RateLimiter in .NET auf: FixedWindow, SlidingWindow, TokenBucket und ConcurrencyLimiter. Beschreibt die Anfragenverarbeitung, FIFO/LIFO-Warteschlangen, Lease und Statistiken. Material für Senior-Entwickler.

Architektur der grundlegenden RateLimiter-Limiter in .NET
Advertisement 728x90

## Grundlegende Rate Limiter im universellen .NET RateLimiter: Architektur und Algorithmen

Die universelle .NET-Rate-Limiting-Komponente umfasst vier grundlegende algorithmische Limiter: FixedWindowRateLimiter, SlidingWindowRateLimiter, TokenBucketRateLimiter und ConcurrencyLimiter. Der Erste implementiert ein festes Fenster, der Zweite ein gleitendes Fenster, der Dritte einen Token-Eimer und der Vierte begrenzt die Parallelität.

Rate-Limiter-Klassen erben von ReplenishingRateLimiter, das die Logik für die Wiederauffüllung von Erlaubnissen über einen Timer definiert. ConcurrencyLimiter erbt direkt von RateLimiter. Konstruktoren nehmen Konfigurationsparameter entgegen, die in einer Kopie von Options gespeichert werden.

Alle implementieren AttemptAcquireCore (synchron), AcquireAsyncCore (asynchron), Dispose/DisposeAsync. Rate Limiter fügen außerdem ReplenishInternal hinzu.

Google AdInline article slot

Behandlung von Erlaubnisanfragen

Anfragen werden in Testanfragen (permitCount = 0) und echte Anfragen (permitCount > 0) unterteilt. Negative Werte werfen eine ArgumentOutOfRangeException.

Verarbeitungsalgorithmus:

  • Überprüfen, ob permitCount ≤ AutoReplenishment.MaxPermits.
  • Bei Testanfragen: Wenn availablePermits > 0 — sofortiger Erfolg.
  • Lock auf die Queue-Deque erwerben.
  • Wenn availablePermits ≥ permitCount — Erlaubnisse gewähren, dekrementieren und Lock freigeben.
  • Andernfalls: synchrone Ablehnung oder zur Queue hinzufügen (asynchron).

Die asynchrone Methode gibt ValueTask<RateLimitLease> zurück. Bei Queue-Überlauf — Ablehnung.

Google AdInline article slot

Queue-Struktur für Anfragen

Die Queue ist eine deque<RequestRegistration>, wobei RequestRegistration von TaskCompletionSource<RateLimitLease> erbt.

Queue-Einstellungen in Options:

  • QueueLimit: maximale Summe von permitCount in der Queue.
  • QueueProcessingOrder: OldestFirst (FIFO, Standard) oder NewestFirst (LIFO).

Aktuelle Größe: _queueTotalPermits. Locking auf Deque.

Google AdInline article slot

Bei Erlaubniswiederauffüllung: Dequeue, CompleteTask mit erfolgreichem Lease, _queueTotalPermits dekrementieren.

Rückgabe von Leases und Statistiken

Methoden geben Derivate von RateLimitLease zurück:

  • FixedWindowLease, SlidingWindowLease, TokenBucketLease (ähnlich).
  • ConcurrencyLease (anders).

Zähler: _successfulAcquires, _failedAcquires (Interlocked.Increment).

RateLimiterStatistics liefert:

  • AvailablePermits.
  • CurrentQueueLength.
  • Zähler.

Die Eigenschaft IdleDuration verfolgt die Zeit, die untätig ohne Anfragen verbracht wurde.

Merkmale jedes Limiters

FixedWindowRateLimiter

Festes Fenster: Erlaubnisse werden zu Beginn des Fensters (permitPeriod) wieder aufgefüllt.

_availablePermits wird auf MaxPermits zurückgesetzt.

SlidingWindowRateLimiter

Gleitendes Fenster: Verfolgt die Historie über SlidingWindowSize Segmente (segmentSize = permitPeriod / SlidingWindowSize).

Wird basierend auf vorherigen Segmenten wiederhergestellt.

TokenBucketRateLimiter

Token-Eimer: _tokens werden alle ReplenishmentPeriod wieder aufgefüllt, Rate = TokensPerPeriod.

Begrenzt Ausgaben basierend auf refillAmount.

ConcurrencyLimiter

Begrenzt _currentConcurrency ≤ PermitLimit.

Queue startet Tasks bei Abschluss aktiver (OnCompleted).

Wichtige Punkte

  • Vielseitigkeit: grundlegende Limiter bilden die Basis für ASP.NET Core Rate Limiting und sind auch außerhalb von Web-Kontexten einsetzbar.
  • Queue: unterstützt FIFO/LIFO, Begrenzung durch Summe der Permits, asynchrone Ausführung.
  • Testanfragen: permitCount=0 zum Überprüfen ohne Verbrauch.
  • Statistiken: atomare Zähler + Echtzeitmetriken.
  • Wiederauffüllung: timer-gesteuert für alle ReplenishingRateLimiter.

— Editorial Team

Advertisement 728x90

Weiterlesen