Rate Limiting in C# (.NET): Vollständiger Leitfaden zur Bibliothek System.Threading.RateLimiting

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Rate Limiting in C# (.NET): Bibliothek System.Threading.RateLimiting



Rate Limiting (Anfragenratenbegrenzung) ist ein kritischer Mechanismus zum Schutz von APIs, Microservices und Webanwendungen vor Überlastung, DDoS-Angriffen und unkontrolliertem Ressourcenverbrauch. Im .NET-Ökosystem gibt es seit .NET 7 die integrierte Bibliothek System.Threading.RateLimiting, die flexible und leistungsstarke Werkzeuge zur Implementierung verschiedener Begrenzungsstrategien bereitstellt.



Was ist Rate Limiting und warum wird es benötigt?

Rate Limiting ermöglicht die Kontrolle der Anzahl von Operationen (Anfragen, Methodenaufrufe, Transaktionen) innerhalb eines bestimmten Zeitraums. Hauptanwendungsszenarien:

  • Schutz öffentlicher APIs — Verhinderung von Missbrauch durch Clients.
  • Stabilisierung des Backends — gleichmäßige Verteilung der Last auf Datenbanken und externe Dienste.
  • Ressourcenschonung — Begrenzung von Aufrufen kostenpflichtiger Drittanbieter-APIs.
  • Sicherstellung von SLAs — Garantie gleichen Zugangs für alle Benutzer.


Hauptkomponenten der Bibliothek System.Threading.RateLimiting

Die Bibliothek ist um die abstrakte Klasse RateLimiter und mehrere vorgefertigte Implementierungen aufgebaut:



1. TokenBucketRateLimiter (Token-Bucket-Algorithmus)

Klassischer Algorithmus, der Token mit einer bestimmten Rate (Replenishment Rate) ansammelt und bei Bedarf nutzbar macht. Geeignet zum Glätten von Lastspitzen.

using System.Threading.RateLimiting;

var limiter = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions{ TokenLimit = 100, // Maximale Anzahl von Token TokensPerPeriod = 20, // Wie viele Token pro Periode hinzugefügt werden ReplenishmentPeriod = TimeSpan.FromSeconds(1), // Auffüllperiode QueueLimit = 10, // Maximale Warteschlangengröße QueueProcessingOrder = QueueProcessingOrder.OldestFirst});

// Beispiel zur Verwendungusing var lease = await limiter.AcquireAsync(cancellationToken: CancellationToken.None);if (lease.IsAcquired){ // Operation ausführen Console.WriteLine("Token erhalten");}else{ // Ablehnung behandeln Console.WriteLine("Limit überschritten, versuchen Sie es später erneut");}


2. ConcurrencyLimiter (Parallelitätsbegrenzung)

Begrenzt die Anzahl gleichzeitiger Operationen. Ideal zur Steuerung des Zugriffs auf begrenzte Ressourcen (Verbindungspools, Dateideskriptoren).

var concurrencyLimiter = new ConcurrencyLimiter(new ConcurrencyLimiterOptions{    PermitLimit = 10,           // Maximal 10 gleichzeitige Anfragen    QueueLimit = 5,             // Warteschlange für bis zu 5 Anfragen    QueueProcessingOrder = QueueProcessingOrder.NewestFirst});

// Verwendung im asynchronen Kontextasync Task ProcessRequestAsync(){ using var lease = await concurrencyLimiter.AcquireAsync(); if (lease.IsAcquired) { // Ressourcenintensive Aufgabe ausführen await Task.Delay(1000); }}


3. FixedWindowRateLimiter (Festes Fenster)

Einfachster Algorithmus: Erlaubt N Operationen in einem festen Zeitintervall (z. B. 100 Anfragen pro Minute). Nach Ablauf des Fensters wird der Zähler zurückgesetzt.

var fixedWindow = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions{    PermitLimit = 60,               // 60 Anfragen    Window = TimeSpan.FromMinutes(1), // pro 1 Minute    QueueLimit = 0,                 // Ohne Warteschlange    AutoReplenishment = true        // Automatisches Zurücksetzen des Fensters});

// LimitprüfungRateLimitLease lease = fixedWindow.AttemptAcquire();if (lease.IsAcquired){ Console.WriteLine($"Verbleibende Versuche: {lease.GetAllMetadata()}");}


4. SlidingWindowRateLimiter (Gleitendes Fenster)

Bo

Empfehlungen