Le web app rappresentano lo strumento principale che possiamo adottare sulla piattaforma cloud di Microsoft per ospitare i nostri siti, front end o back end. Data la flessibilità di cui dispongono, è normale disporre di più istanze il cui carico viene automaticamente bilanciato tramite round robin. Le istanze poi, possono variare durante la giornata a seconda delle regole di auto scaling, in base ad orari fissi o a seconda dei carichi di CPU o di memoria.
In tutte le situazioni in cui la nostra web app effettua delle elaborazioni, tramite framework come ASP.NET, Java, PHP o node.js, la prima esecuzione della nostra web app è più lenta e può richiedere anche diversi secondi. Con la flessibilità di istanza illustrata in precedenza, inoltre, può verificarsi che un utente si trovi ad essere il primo ad effettuare la richiesta ad un nuovo server, trovandosi con lunghi tempi di risposta.
Per ovviare a questo problema IIS 8 dispone di un modulo nativo, utilizzabile con qualsiasi framework web, che si occupa di effettuare il warmup del nostro applicativo. L'aspetto interessante è che IIS è in grado comunque di restituire contenuti statici e quindi possiamo sfruttare una pagina HTML di attesa. Per usufruire di questa funzionalità dobbiamo intervenire sulla sezione system.webServer.
<configuration> <system.webServer> <applicationInitialization doAppInitAfterRestart="true" remapManagedRequestsTo="startup.html" skipManagedModules="true"> <add initializationPage="/default.aspx" /> <!-- hostName facoltativo --> <add initializationPage="/home/index" hostName="miodominio.it" /> </applicationInitialization> </configuration> </system.webServer>
Innanzitutto notiamo che nell'elemento applicationInitialization possiamo indicare uno o più URI da richiamare, dei quali però ignora l'esito. Il compito di IIS è di chiamare gli indirizzi nell'ordine stabilito, aspettandone l'esito, e si occupa di farlo anche in caso di riavvio, grazie all'attributo doAppInitAfterRestart. Con l'attributo remapManagedRequestsTo, invece, indichiamo facoltativamente la pagina da restituire all'utente, qualunque sia l'indirizzo che chiede; se omesso IIS restituisce un 503. Nel nostro caso, la pagina startup.html può essere come la seguente, la quale cerca di ricaricare la pagina fino a quando verrà restituito il contenuto reale dell'applicativo.
<html> <head> <!-- refresh dopo 5 secondi --> <meta http-equiv="refresh" content="5"> </head> <body> Avvio in corso </body> </html>
L'aspetto più interessante è relativo al load balancer di Azure. Se nessuna istanza è pronta, restituisce la pagina HTML, mentre se almeno un'istanza è pronta, manda l'utente tra quelle disponibili, fino a quando nuove istanze si possono sfruttare. Il risultato è un'ottima esperienza utente che non nota il variare dei server che mettiamo a disposizione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Applicare un filtro per recuperare alcune issue di GitHub
Utilizzare WebJobs su Linux con Azure App Service
Utilizzare WhenEach per processare i risultati di una lista di task
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Implementare il throttle in JavaScript
Utilizzare Locust con Azure Load Testing
Potenziare la ricerca su Cosmos DB con Full Text Search
Testare il failover sulle region in Azure Storage
Escludere alcuni file da GitHub Secret Scanning
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Eseguire una ricerca avanzata per recuperare le issue di GitHub
I più letti di oggi
- PWAConf 2020 - Online
- Gestione ciclo di vita in .NET Aspire
- Inserire, modificare o cancellare record con ADO.NET
- Redirect automatico da HTTP a HTTPs
- #SQLServer #Modeling (codename Oslo) CTP di nov 2009 aggiornato per VS 2010 RC: http://u.aspitalia.com/fi
- Supporto migliorato agli statement condizionali nelle pipeline di Azure DevOps
- Semplificare il deploy di applicazioni Silverlight con la compilazione condizionale
- Gestire l'errore di caricamento dell'immagine in Silverlight 2.0
- Rimandare l'elaborazione di un messaggio di una coda Service Bus in Windows Azure
- Abilitare la compressione GZip nei website di Windows Azure