Rate Limiting in C# (.NET): Vollständiger Leitfaden zur Bibliothek System.Threading.RateLimiting
\n\nIn 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.
Was ist System.Threading.RateLimiting?
\nSystem.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.
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
Integrierte Rate-Limiting-Strategien
\nDie Bibliothek unterstützt vier Hauptstrategien:
\n\n1. Festes Fenster (Fixed Window)
\nAnfragen werden in Zeitfenstern fester Länge gruppiert. Wenn das Limit überschritten wird, werden Anfragen bis zum Beginn des nächsten Fensters abgelehnt.
\nusing 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\n2. 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.
\nvar 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\n3. Token Bucket
\nEiner 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.
\nvar 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\n4. Concurrency Limiter
\nBegrenzt die Anzahl der gleichzeitig ausgeführten Anfragen. Nützlich für die Steuerung des Parallelismus, nicht der Rate.
\nvar concurrencyOptions = new ConcurrencyLimiterOptions\n{\n PermitLimit = 5,\n QueueLimit = 10\n};\n\nvar concurrencyLimiter = new ConcurrencyLimiter(concurrencyOptions);\n\nVerwendung von RateLimiter in ASP.NET Core
\nAb .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 Auch in der Bibliothek
ORM für Java: Vergleich von Hibernate, MyBatis und JPA mit Beispielen
Überwachung von C++-Anwendungen: Bibliotheken und Tools zur Metrikenerfassung
Prometheus-Metriken in Node.js: Die Bibliothek prom-client für das Monitoring
ModelMapper Java: Vollständige Anleitung mit Beispielen