Rate Limiting in C# (.NET): 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): Vollständiger Leitfaden zur Bibliothek System.Threading.RateLimiting

\n\n

In modernen Webanwendungen und Microservices ist es entscheidend, die Auslastung von Ressourcen zu kontrollieren. Rate Limiting (Anfragenratenbegrenzung) ist ein Mechanismus, der eine übermäßige Nutzung von APIs, Datenbanken oder anderen Komponenten verhindert. Im .NET-Ökosystem gibt es die integrierte Bibliothek System.Threading.RateLimiting, die flexible und leistungsstarke Werkzeuge zur Implementierung von Rate Limiting bereitstellt. In diesem Artikel werden wir ihre Funktionen, Architektur und Anwendungsbeispiele im Detail untersuchen.

\n\n

Was ist System.Threading.RateLimiting?

\n

System.Threading.RateLimiting ist eine Bibliothek, die Teil von .NET 7 und höher ist. Sie bietet Abstraktionen und Implementierungen für verschiedene Strategien zur Ratenbegrenzung. Die Hauptklasse ist RateLimiter, die den Zugriff auf eine Ressource verwaltet, indem sie Anfragen basierend auf festgelegten Regeln zulässt oder ablehnt.

\n\n

Grundlegende Konzepte

\n
    \n
  • RateLimiter — Die Basisklasse, von der alle Implementierungen erben.
  • \n
  • Acquire / TryAcquire — Synchrone Methoden zum Anfordern einer Genehmigung.
  • \n
  • AcquireAsync / WaitAsync — Asynchrone Methoden, die das Warten auf die Freigabe des Limits ermöglichen.
  • \n
  • Metadata — Zusätzliche Informationen über das Limit (z. B. Zeit bis zum Reset).
  • \n
\n\n

Integrierte Rate-Limiting-Strategien

\n

Die Bibliothek unterstützt vier Hauptstrategien:

\n\n

1. Festes Fenster (Fixed Window)

\n

Anfragen werden in Zeitfenstern fester Länge gruppiert. Wenn das Limit überschritten wird, werden Anfragen bis zum Beginn des nächsten Fensters abgelehnt.

\n
using System.Threading.RateLimiting;\n\nvar options = new FixedWindowRateLimiterOptions\n{\n    PermitLimit = 10,\n    Window = TimeSpan.FromSeconds(1),\n    QueueProcessingOrder = QueueProcessingOrder.OldestFirst,\n    QueueLimit = 0\n};\n\nvar limiter = new FixedWindowRateLimiter(options);\n\nfor (int i = 0; i < 15; i++)\n{\n    using var lease = await limiter.AcquireAsync();\n    if (lease.IsAcquired)\n    {\n        Console.WriteLine($"Anfrage {i} ausgeführt");\n    }\n    else\n    {\n        Console.WriteLine($"Anfrage {i} abgelehnt");\n    }\n}
\n\n

2. Gleitendes Fenster (Sliding Window)

\n

Ähnlich wie das feste Fenster, aber das Fenster „gleitet“ mit jeder Anfrage und sorgt für eine gleichmäßigere Begrenzung. Es ist in Segmente unterteilt.

\n
var slidingOptions = new SlidingWindowRateLimiterOptions\n{\n    PermitLimit = 10,\n    Window = TimeSpan.FromSeconds(1),\n    SegmentsPerWindow = 4,\n    QueueLimit = 0\n};\n\nvar slidingLimiter = new SlidingWindowRateLimiter(slidingOptions);
\n\n

3. Token Bucket

\n

Einer der beliebtesten Algorithmen. Der Bucket fasst eine bestimmte Anzahl von „Tokens“. Tokens werden mit einer festgelegten Rate hinzugefügt. Eine Anfrage verbraucht einen oder mehrere Tokens. Wenn der Bucket leer ist, wartet die Anfrage oder wird abgelehnt.

\n
var tokenOptions = new TokenBucketRateLimiterOptions\n{\n    TokenLimit = 100,\n    QueueLimit = 0,\n    ReplenishmentPeriod = TimeSpan.FromSeconds(1),\n    TokensPerPeriod = 10,\n    AutoReplenishment = true\n};\n\nvar tokenLimiter = new TokenBucketRateLimiter(tokenOptions);
\n\n

4. Concurrency Limiter

\n

Begrenzt die Anzahl der gleichzeitig ausgeführten Anfragen. Nützlich für die Steuerung des Parallelismus, nicht der Rate.

\n
var concurrencyOptions = new ConcurrencyLimiterOptions\n{\n    PermitLimit = 5,\n    QueueLimit = 10\n};\n\nvar concurrencyLimiter = new ConcurrencyLimiter(concurrencyOptions);
\n\n

Verwendung von RateLimiter in ASP.NET Core

\n

Ab .NET 7 kann Rate Limiting einfach in die Middleware von ASP.NET Core integriert werden. Registrierung von Diensten und Konfiguration von Richtlinien:

\n
// Program.cs\nbuilder.Servi                    

Empfehlungen