Nello script #219 si sono presentate le queue di Windows Azure, che per la loro natura sono ottime per scalare perché permettono di disaccoppiare e di aumentare i motori che possono scodare gli elementi. E' opportuno però non abusare della facoltà di scalare pensando che ciò voglia dire avere anche prestazioni. Ogni motore che si decide di applicare deve trarre il massimo dalle potenzialità della macchina secondo il genere di lavoro che ogni messaggio poi va a scatenare.
Ad esempio, se l'attività comprende operazioni intensive sulla CPU che però non vanno ad impegnarla interamente oppure effettua attività di rete con una certa latenza, può convenire processare contemporaneamente, anche sullo stesso motore, più di un messaggio.
Per raggiungere questo obiettivo è possibile sfruttare la parallelizzazione delle operazioni attraverso una libreria introdotta con il .NET Framework 4.0: la task parallel library. In particolare, il metodo statico ForEach della classe Parallel permette di prendere un IEnumerable e di invocare un delegato per ogni elemento. Inoltre il motore decide automaticamente di passare all'elemento successivo mentre l'altro è in esecuzione in base ai carichi e ai tempi di esecuzione delle attività.
L'idea è quindi di preparare una funzione che restituisca un IEnumerable
private IEnumerable<CloudQueueMessage> GetMessages() { CloudQueueMessage message; // Carico il prossimo messaggio while ((message = this.Queue.GetMessage(TimeSpan.FromSeconds())) != null) { // Restituisco il messaggio, quando necessario yield return message; } }
A questo punto è possibile usare TPL per eseguire una funzione, che nell'esempio si chiama ProcessMessage, per processare il messaggio ed eliminarlo.
// Ottengo la lista dinamicca var messages = this.GetMessages(); // Uso TPL per parallelizzare Parallel.ForEach(messages, this.ProcessMessage);
E' importante notare che in questo modo non vengono scaricati tutti i messaggi, ma solo quelli che il motore pian piano è in grado di processare. Occorre però prestare attenzione al fatto che i tempi di processamento dei messaggi potrebbero diventare più lunghi ed è quindi importante lavorare correttamente con i tempi di visibilità di essi.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Simulare Azure Cosmos DB in locale con Docker
Ottimizzare le performance usando Span<T> e il metodo Split
Utilizzare l nesting nativo dei CSS
Utilizzare Container Queries nominali
Selettore CSS :has() e i suoi casi d'uso avanzati
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Utilizzare Hybrid Cache in .NET 9
Utilizzare Azure AI Studio per testare i modelli AI
Creare una libreria CSS universale - Rotazione degli elementi
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Gestione dell'annidamento delle regole dei layer in CSS
Creare agenti facilmente con Azure AI Agent Service
I più letti di oggi
- le nuove api in #wp7 #mango (7.1) sono già su msdn: http://aspitalia.com/w5 nel pomeriggio microsoft svelerà le altre novità
- #office 2010 beta 2 e #sharepoint 2010 su MSDN e TechNet downloads http://u.aspitalia.com/cv
- Annunciata l'app di #Azure per #iOS e #Android con supporto alla Cloud Shell! https://aspit.co/build2017 #msbuild
- Recuperare un elemento inserito nella cache del browser tramite API JavaScript
- Microsoft TechDays-WPC 2010 - Assago (MI)
- .NET Conference Italia 2024 - Milano