In alcuni casi, può essere necessario limitare il numero di richieste che il nostro server ASP.NET Core possa servire, per esempio perché vogliamo evitare sovraccarichi alle nostre risorse, per limitare la concorrenza in particolari endpoint, o semplicemente per un requisito di business - gli utenti "free" possono eseguire al massimo 10 richieste al minuto.
ASP.NET Core, dalla versione 7.0, espone nativamente questa funzionalità, che introdurremo in questo script e di cui ci occuperemo anche nelle settimane a venire.
Immaginiamo allora di avere creato il classico progetto Web API con l'endpoint di WeatherForecast, come da template Visual Studio, e proviamo a eseguire un run con k6, che abbiamo imparato a utilizzare nello scorso script (https://www.aspitalia.com/script/1462/Load-Test-ASP.NET-Core-K6.aspx):
k6 run --vus 5 --duration 60s --out dashboard .\basic.js
Se guardiamo il report tramite xk6-dashboard (https://github.com/grafana/xk6-dashboard), possiamo notare che abbiamo un throughput di poco meno di 5k req/sec:

Per attivare il rate limiting, dobbiamo configurarlo nel nostro Program.cs:
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// .. altro codice qui ..
builder.Services.AddRateLimiter(_ =>
{
_.AddFixedWindowLimiter("default", options =>
{
options.QueueLimit = 100;
options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
options.PermitLimit = 50;
options.Window = TimeSpan.FromSeconds(1);
});
});
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseRateLimiter();
// .. altro codice qui ..
}Nel codice in alto, abbiamo configurato una policy chiamata "default" sfruttando una delle 4 tipologie di rate limiting differenti, FixedWindow, tramite cui possiamo specificare il numero massimo di richieste in un determinato lasso di tempo: nel nostro caso, 50 richieste al secondo, a prescindere dalla loro concorrenza (potrebbero arrivare 50 richieste nel primo decimo di secondo, che esaurirebbero completamente il limite fino allo scoccare del secondo successivo). Esistono altre implementazioni, di cui parleremo in un prossimo script.
Abbiamo anche aggiunto la funzionalità di gestione della coda di richieste, accettando fino a un massimo di 100 richieste pendenti: queste resteranno in coda fino a una nuova disponibilità nel limite, mentre le altre riceveranno un errore 503 - Service Unavailable.
Dopo aver effettuato la configurazione, non dobbiamo far altro che registrare il middleware tramite l'extension method UseRateLimiter.
A questo punto, possiamo attivarlo nel nostro controller, tramite l'attributo EnableRateLimiting:
[ApiController]
[Route("[controller]")]
[EnableRateLimiting("default")]
public class WeatherForecastController : ControllerBase
{
// .. altro codice qui ..
}Se ora proviamo a rieseguire lo stesso load test di prima, noteremo come effettivamente il Rate Limiting intervenga a limitare la quantità di richieste gestite al secondo:

Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Applicare il progressive enhancement in applicazioni web
Utilizzare le librerie native di .NET per comprimere uno o più file in formato ZIP
DevSecOps per .NET: dalla teoria alla pratica
Migrare applicazioni legacy nel cloud con Azure App Service Managed Instance
Utilizzare i named query filter di Entity Framework
Logica Graceful Degradation in HTML e CSS
Cambiamenti in OpenAPI per la documentazione di ASP.NET
Gestire trasferimenti cloud con Azure Storage Mover
Ricerca delle GitHub issue tramite operatori logici
Planning & Specification Driven Development + GitHub Copilot
Referenziare un package NuGet in una file based app .NET
Effettuare un clone parziale di un repository di GitHub
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Consumare dati binari in realtime lato client con ASP.NET Core SignalR
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Caricamenti veloci da CDN e fallback locale con ASP.NET Core
- Utilizzare dati in formato XML in XAML
- Accedere a dati esposti con WebService con Silverlight 1.0


