La piattaforma di Windows Azure include una serie di servizi particolarmente indicati per scalare, cioè utili per poter soddisfare gli incrementi di lavoro che si possono verificare mantenendo le medesime prestazioni. Si pensi ad esempio ad un sistema che invia e-mail tramite una newsletter, oppure alla gestione di aste, annunci, notifiche ecc. In questo genere di situazioni, quando le attività si fanno più intense, il collo di bottiglia si verifica maggiormente a livello di database, che deve mantenere le attività da eseguire e soddisfatte, o a livello del motore che deve eseguire le attività. Inviare ad esempio un'email non è un'attività onerosa, ma introduce comunque della latenza che può allungare i tempi di invio.
Le code sono da sempre la soluzione ottimale per risolvere queste situazioni perché scalano e anche con Windows Azure vi è uno strumento che è possibile sfruttare: le queue. Grazie alle classi managed, e nello specifico CloudQueueClient, è possibile gestire una coda di messaggi che si possono poi reperire in ordine FIFO. Nel codice seguente si crea ad esempio il client, si assicura che la coda sia disponibile e si inserisce il messaggio:
// Preparo l'account CloudStorageAccount account = CloudStorageAccount.Parse("UseDevelopmentStorage=true;"); // Ottengo il client CloudQueueClient client = account.CreateCloudQueueClient(); // Mi assicuro che la coda esiste CloudQueue queue = client.GetQueueReference("test"); queue.CreateIfNotExist(); // Aggiungo il messagio queue.AddMessage(new CloudQueueMessage("cristian@aspitalia.com"), TimeSpan.FromDays(1));
Il metodo CreateIfNotExist si può anche evitare qualora si è sicuri che la coda esiste, risparmiando una chiamata REST che comunque costa in termini di banda, ma anche di transazioni al servizio. Il metodo AddMessage invece permette di specificare facoltativamente quanto tempo il messaggio risiede nella coda (se omessa sono 7 giorni). Il messaggio, che può essere specificato come stringa o in binario, non può superare gli 8KB e deve mantenere le informazioni necessarie per permette le attività a chi poi smaltisce la coda.
Popolando la coda nei più disparati modi, la potenza di questa tecnica risiede nel fatto che possibili n motori, tra cui dei worker role, possono recuperare questi messaggi e smaltirli uno alla volta. Nel codice seguente ad esempio si simula di mandare l'email ciclando sulla coda:
while (true) { // Ottengo il messaggio CloudQueueMessage message = queue.GetMessage(TimeSpan.FromSeconds(10)); if (message != null) { string email = message.AsString; // Invio dell'email... Console.WriteLine(email); // Cancello il messaggio queue.DeleteMessage(message); } else // Attendo 5 secondi System.Threading.Thread.Sleep(5000); }
La chiamata a GetMessage garantisce che il messaggio venga ottenuto solo da un unico chiamante, evitando problemi di concorrenza tra più motori che possono lavorare sulla medesima coda. Questo è possibile grazie ad una finestra temporale, specificata con il secondo parametro del metodo GetMessage, che nasconde il messaggio per una durata massima di due ore (se non specificato è 30 secondi), intervallo nel quale è necessario chiamare in tempo il metodo DeleteMessage. E' compito dello sviluppatore quindi scrivere codice le cui tempistiche siano prevedibili, oppure rimuovere subito il messaggio indipendentemente dall'esito dell'attività.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Creare una libreria CSS universale: Nav menu
Supportare la sessione affinity di Azure App Service con Application Gateway
Eseguire script pre e post esecuzione di un workflow di GitHub
Ridurre il reflow cambiando il CSS
Scrivere selettori CSS più semplici ed efficienti con :is()
Gestire gli accessi con Token su Azure Container Registry
Utilizzare una qualunque lista per i parametri di tipo params in C#
Utilizzare Copilot con Azure Cosmos DB
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Configurare e gestire sidecar container in Azure App Service
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- .NET Conference Italia 2024 - Milano
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il pattern matching per semplificare le espressioni