Microsoft Velocity step-by-step #1: Cos’è? A cosa serve?

Questa serie di post ha lo scopo di fornire contenuti in italiano su Microsoft Velocity.

Dopo aver postato alcuni contributi sul mio blog in inglese ed aver avuto l’occasione, grazie ad Andrea e Daniele, di presentare una sessione introduttiva durante i Community Nights, ho deciso di allineare gli stessi anche in italiano su questo blog. Allineare tentando uno stile diverso da quello di un articolo o post tecnico, ci provo…

Microsoft Velocity è un recente progetto che si propone di fornire una nuova Cache Applicativa, sfruttabile da applicazioni web e smart-client.

Probabilmente inizierete a chiedervi perchè questo progetto potrebbe interessarvi e magari tornarvi utile, del resto abbiamo già a disposizione diversi tipi di cache ad esempio ASP.Net e Enterprise Library Caching Application Block, terze parti o magari ne avete sviluppato uno custom.

Prima di tutto, ricordiamo il concetto di Cache ovvero:

un area di memoria in cui è possibile inserire temporaneamente dei dati che possono essere in seguito richiamati velocemente, con prestazioni migliori rispetto allo storage fisico di persistenza.

Il fatto che i dati siano “temporaneamente” parcheggiati nella cache, richiede che l’applicazione che ne fa uso, sia in grado anche di reperirli autonomamente dallo storage fisico (database, filesystem, ecc.), tutto cio è riconosciuto come Cache-Aside pattern. Se il framework di Cache utilizzato supporta anche la funzionalità di lettura dallo storage fisico, quando il dato non è presente nella cache e di scrittura nello stesso, quando un dato viene sostituito nella cache, allora si parla di Cache-Through pattern. Velocity attualmente in CTP3 prevede il supporto di tipo Cache-Aside, nella futura V1 SP1 supporterà anche il Cache-Through.

Hosting della cache ed interazione con l’applicazione
Spesso si nomina la parola “memoria”, quando si fà riferimento ad un contenitore per i nostri dati, ma dove risiede la cache? Come si interagisce con questa?
La cache deve essere necessariamente un oggetto istanziato in un appDomain, che è sinteticamente una unità logica di isolamento della memoria utilizzata da un processo. Se l’istanza dell’applicazione condivide lo stesso processo in cui è stata istanziata la cache, allora quest’ultima è detta in-process. Occorre però distinguere un processo da un appDomain: in un singolo processo è possibile creare più appDomain, ma attenzione: è sufficiente creare un appDomain ad-hoc per la cache, (diverso da quello dell’applicazione) per incontrare problematiche di comunicazione e marshaling cross-appDomain, risolte ad esempio da Remoting o WCF. In sintesi se Cache è In-Process, non bisogna preoccuparsi dell’hosting e della comunicazione con l’applicazione: è semplicemente un oggetto di cui si crea un istanza e se ne consumano i metodi GET e PUT. Cosa succede l’applicazione deve essere distribuita su una webFarm, o più semplicemente condividere i dati in cache con altre applicazioni web o smart-client?

Una cache out-of-process
Affinchè due o più istanze di un’applicazione condividano una cache applicativa, è necessario implementare una cache out-of-process differente da quanto prima illustrato. Bisogna quindi avviare un processo e gestirne tutto il cliclo di vita, tipicamente un Windows Service che, operando su un “canale” eroghi la funzionalità di cache, ricevendo e restituendo i dati utilizzati dalle diverse istanze dell’applicazone. Dal momento che l’applicazione e la cache non condividono più lo stesso appDomain, è necessaro gestire la serializzazione, il trasporto e la deserializzazione dei dati dall’applicazione verso la cache e viceversa. Questa purtroppo è solo la punta dell’iceberg, occorre infatti gestire anche il locking, la consistenza, il riciclo del processo, la scadenza degli oggetti… insomma tutte le funzionalità tipiche di una cache applicativa, elencate in questa
tabella.
La cache di ASP.Net e quella di Enterprise Library Caching Application Block, mettono a disposizione un ricco set di funzionalità, ma sono entrambe, almeno nativamente, in-process. Questo significa che ogni web application accede alla propria cache, anche se sono distribuite sullo stesso server. Nel caso di EntLib Caching Application Block, è necessario gestire anche la creazione e l’hosting di un istanza di CacheManager.

Scenari di utilizzo
Quali sono le situazioni in cui si potrebbe beneficiare dell’introduzione di una cache out-of-process? Non occorre necessariamente avere una web farm, è sufficiente avere l’esigenza di condividere una cache applicativa tra diverse applicazioni, magari di diverso tipo: web, smart-client, servizio web o WCF. Se un’applicazione web è distribuita su di una web farm, tutte le istanze dell’applicazione potranno accedere e condividere la stessa cache, un servizio windows o un’applicazione smart-client dal back office potrebbero fare altrettanto. Una cache out-of-process è tipicamente erogata da un servizio, installato su un server, che resta in ascolto sul “canale” servendo tutte le richieste di get e put provenienti dalle diverse istanze delle diverse applicazioni. Nello scenario appena descritto, le risorse della cache applicativa sono limitate a quelle del server che la ospita, così come la sua disponibilità. Velocity mette a disposizione un cache cluster che supera queste limitazioni, sfruttando le risorse di un gruppo di server e la ridondanza derivante dalle repliche degli oggetti su server secondari. Il layer di cache è trasversale rispetto a tutti i server appartenenti al cluster, i dati vengono distribuiti senza che l’applicazione ne conosca la posizione, introducendo una caratteristica nuova conosciuta come location-ignorance. Qualora un server dovesse, per un intervento di manutenzione programmato o per un guasto, non essere più disponibile la tecnologia di clustering di Velocity (Fabric) eleggerebbe come “primarie” le copie secondarie degli oggetti perduti, creando una ulteriore copia secondaria su i rimanenti server. Ciò consente di tollerare situazioni di guasto o di temporanea indisponibilità di un server, senza intaccare la stabilità del cluster e dell’applicazione che utilizza la cache. Il server una volta tornato operativo, può rientrare immediatamente nel cluster aumentandone la scalabilità.

“Oh no! Abbiamo fatto tutti e due la spesa, dovevo farla io! “
Quando su utilizza una cache, bisogna tenere in considerazione situazioni un cui l’applicazione, non trovando il dato in cache, proceda con il suo caricamento dallo storage fisico. In questo intervallo di tempo un’altra istanza dell’applicazione potrebbe intraprendere la stessa azione, causando una Race Condition. Tipicamente il rischio di schedulare in successione (o in contemporanea) due o più letture del dato dallo storage fisico, viene attenuato mediante utilizzo di locks, ove possibile in memoria e prima di collegarsi allo storage fisico. Velocity, mediante l’utilizzo di locks, consente di gestire in maniera trasparente la consistenza degli oggetti in cache, consentendo di caricare i dati in maniera univoca su tutto il cluster, riducendo significativamente gli accessi allo storage rispetto ad una cache verticale, confinata ad ogni singolo server.

Esperienza di sviluppo
Una volta predisposto il cluster di Velocity (si tratta di installare un servizio su ciascun server), occorre creare i “contenitori” (namedCache) che l’applicazione userà per reperire e immagazzinare gli oggetti nella cache, eseguendo il comando new-cache –cacheName MyCatalog tramite la console di PowerShell. Infine è sufficiente aggiungere poche reference al progetto (web o smart-client che sia) e sfruttare la client API, che ha la stessa semplicità di una Hashtable ma tutte le funzionalità di Velocity: una cache out-of process, scalabile, affidabile e performante.

Riferimenti

• Project Home Page
http://msdn.microsoft.com/en-us/data/cc655792.aspx

• Velocity Blog and Forum
http://blogs.msdn.com/velocity/
http://social.msdn.microsoft.com/Forums/en-US/velocity/

• CTP3 Downloads
http://www.microsoft.com/downloads/details.aspx?FamilyID=7bff4e84-7bad-417a-9b6c-5371db6609aa&displaylang=en
http://www.microsoft.com/downloads/details.aspx?FamilyId=B24C3708-EEFF-4055-A867-19B5851E7CD2&displaylang=en

• Altro
http://andreacol.net/tags/velocity/
Articolo su MSDN Magazine

posted @ Monday, June 15, 2009 10:26 AM

Print
Comments have been closed on this topic.