Rate Limiting in ASP.NET Core

Rate Limiting in ASP.NET Core

- Matt

Ein Endpoint wurde von einem einzelnen Client mit deutlich zu vielen Anfragen pro Sekunde bombardiert. Bevor ich zu nginx oder Azure API Management gegriffen habe, habe ich mir Microsoft.AspNetCore.RateLimiting angesehen - Teil des Shared Framework, kein zusätzliches NuGet-Paket. AddRateLimiter registriert die Policies, AddFixedWindowLimiter("api", o => { o.PermitLimit = 10; o.Window = TimeSpan.FromSeconds(10); }) steht in Program.cs, am Endpoint hängt .RequireRateLimiting("api") die Policy an. UseRateLimiter() muss nach UseRouting() stehen, sonst greift sie nicht.

Der Haken: Die Limiter zählen pro Prozess. Bei mehreren Instanzen hinter einem Load Balancer sieht jede nur ihren eigenen Anteil der Anfragen, ein verteilter Zähler ist nicht eingebaut. Für einen einzelnen Server reicht das, für einen Dienst mit mehreren Instanzen nicht.

Dokumentation zu Rate Limiting, ähnliches Prinzip wie bei der Fehlerbehandlung in ASP.NET Core.