Microsoft Velocity step-by-step #7: ASP.Net integration

Tra i possibili tipi di applicazione che possono beneficiare di una cache distribuita come quella di Velocity, ci sono sicuramente le applicazioni Asp.Net, che dispongono già di una cache (quella appunto di ASP.Net) matura, stabile e con un ricco set di funzionalità che la completano.
Esaminando la tabella comparativa, si noterà che molte delle features della cache di ASP.Net non sono coperte da Microsoft Velocity, quest’ultimo framework, infatti, non ha l’obiettivo di sostituire la cache di ASP.NET.
Quali sono dunque i punti di contatto tra ASP.Net e Microsoft Velocity? Questa immagine prova ad illustrarlo:

image

Il team di Velocity ha realizzato il session provider Microsoft.Data.Caching.DataCacheSessionStoreProvider, in grado di sfruttare il cluster e la relativa cache distribuita per memorizzare le sessioni di ASP.Net.
E’ da sottolineare che cache e session non sono la stessa cosa, sinteticamente: la prima si utilizza per evitare ad esempio roundtrip sullo storage ed in genere per migliorare le prestazioni di una applicazione, mentre la seconda serve per rendere stateful un’applicazione.
Il cluster di Velocity si affianca quindi ai più noti session provider InProc, StateServer e SQLServer, offrendo un’alternativa scalabile, performante ed affidabile grazie soprattutto alla High-Availability (descritta nel precedente post), che permette di tollerare situazioni di “guasto” all’interno ad esempio di una web farm.

image

Per utilizzare il Session Provider di Velocity, occorre prima creare una named cache, utilizzando Powershell ed avendo facoltà di abilitare o meno l’HA:

new-cache -CacheName session -Secondaries 1

E’ sufficiente quindi agendo sul web.config, istruire ASP.Net ad utilizzare il provider di sessione di Velocity:

image

…impostare alcuni settaggi aggiuntivi riguardanti la Client API:

image

…il puntamento al cluster, che nel caso di questa applicazione web assolve il duplice ruolo di web server e di cache host

image

…infine il logging:

image

A questo punto, l’applicazione web utilizzerà, in maniera trasparente, il cluster di Velocity per memorizzare tutte le sessioni. E’ comunque possibile sfruttare parallelamente Velocity come cache “classica”, memorizzando ad esempio il catalogo prodotti che, come spiegato nel primo post, sarà caricato in cache una sola volta per tutti i client, in questo caso le diverse istanze della web application in esecuzione sui diversi server della farm.

La sequenza di screenshot sotto riportata, simula la navigazione di un’applicazione ASP.Net richiedendo la stessa pagina da 3 Web Server differenti, dimostrando come la sessione (cookieless solo per scopi dimostrativi) sia di fatto gestita da Velocity.
Utilizzando infine la Client API, nelle ultime 3 screenshot, è stato dimostrato un esempio di condivisione della cache out-of-process di Velocity tra diversi tipi di applicazione in questo caso ASP.Net e WinForm.

1 2 3
4 5 6 7

Microsoft Velocity step-by-step #6: High Availability

In questo post viene illustrata una delle feature più interessanti, in scenari enterprise, di Microsoft Velocity: parliamo dell'alta affidabilità o High Availability (HA).
Nel primo post di questa serie, è stato introdotto il concetto di cluster, ovvero un gruppodi server che erogano il servizio di cache distribuita. Ciascun server è soggetto a aggiornamento, manutenzione e, più raramente, a guasti che ne pregiudicano temporaneamente il funzionamento. Grazie alla HA, Microsoft Velocity consente, in maniera trasparente, di gestire queste situazioni di "guasto". La soluzione adottata da Velocity consiste nella creazione di una copia secondaria (attualmente una sola copia) di ciascun oggetto caricato in cache. La copia viene memorizzata su di un server differente da quello contenente l'"originale".
Per abilitate la HA, occorre specificare il parametro –Secondaries1 durante la creazione di una named cache, come di seguito illustrato:

new-cache -CacheName DemoCacheHA -Secondaries 1

Fig.1 Duplicazione degli oggetti in cache, con HA abilitata.

image

image
Il rilevamento dell'indisponibilità di un server, appartenente al cluster di velocity, è il primo step attuato dalla tecnologia interna di clustering (Fabric), per rimediare alla situazione. Appena intercettato il "guasto", Velocity inizia la duplicazione di tutti gli oggetti originariamente esistenti sul server che ha abbandonato il cluster, quest'ultimo infatti, ritornerà operativo nel suo insieme, solo quando gli oggetti appartenenti ad una cache HA-Enabled saranno stati duplicati sugli altri server ancora disponibili.

Fig.2 Ridistribuzione delle nuove copie degli oggetti in cache.

image

image
Sebbene dal punto di vista implementativo, abilitare la HA sia semplicemente questione di specificare il parametro -Secondaries 1 in fase di creazione di una namedCache, dal punto di vista delle prestazioni si ottiene un lieve decadimento in fase di ADD/PUT/REMOVE. Condizione necessaria per finalizzare queste operazioni è infatti creare (o rimuovere) una copia "secondaria" dell'oggetto, su un cache host differente dal primo utilizzato.
Il concetto di HA è trasparente anche rispetto alle regions (descritte in questo post).
Velocity, nella sua attuale versione CTP3, richiede almeno 3 cache hosts per ottenere la HA, nel caso in cui si disponga di soli 2 cache hosts, sarebbe sufficiente che uno di questi si guasti per compromettere l'intero cluster, in termini di alta affidabilità.
E' evidente che, nell'ottica di ottenere l'alta affidabilità, la scelta del configuration store di Velocity basato su SQL Server è da preferire rispetto al network share (basato su SQL Server CE).
Il ripristino dell’operatività del server non è immediato, occorre tenere presente che tra il verificarsi del guasto e l’istante in cui il cluster torna operativo, si verificano diversi eventi e Velocity intraprende diverse azioni, in sintesi avviene quello che è meglio noto come “ritardo di propagazione”.
Supponiamo t0 l’istante in cui un server abbandona il cluster, ad esempio in seguito ad un guasto, Velocity controllerà ad intervalli stabiliti, che tutti i cache host siano “alive” e disponibili, raggiungiendo così l’istante t1. Nel caso in cui un cache host es. Server2 non risponda più, Velocity impiegherà un certo numero di secondi (timeout di comunicazione) per classificarlo come “non disponibile”, raggiungendo l’istante t2. Da qui in poi, per tutti gli oggetti inizialmente contenuti nel cache host Server2 ed appartenenti ad una named cache con HA abilitata, inizierà il processo di duplicazione ed elevamento di eventuali copie da “secondarie” a “primarie” come illustrato in Fig.1 e Fig.2.
Quando tutti gli oggetti saranno stati duplicati, il cluster tornerà nuovamente operativo.
Nel caso in cui, invece, si effettui uno stop manuale di un cache host da con il comando Powershell:

stop-cachehost –hostName Server2 –cachePort 22233

Velocity sarà subito informato dell’indisponibilità del cache host Server2, così t0 + t1 saranno quasi pari a 0, contraiamente a quanto avviente in caso di un guasto improvviso, dove solo lo scadere di un timeout di comunicazione tra cache host potrà confermarlo.

ClusterRecoveryTimeline