## 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.
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.
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.
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
Noch keine Kommentare.