Il presente articolo è stato tradotto automaticamente.
Cache di AppFabric
Utilizzo e integrazione reali
Andrea Colaci
Microsoft Windows Server AppFabric, precedentemente noto come nome in codice “ velocità ” fornisce una cache distribuita è possibile integrare le applicazioni desktop e Web. AppFabric può migliorare le prestazioni, scalabilità e disponibilità durante, dal punto di vista dello sviluppatore funziona come una cache di memoria comune. È possibile memorizzare qualsiasi oggetto serializzabile, compresi i DataSet, DataTable, i dati binari, XML, entità e dati trasferimento oggetti personalizzati.
L'API del client AppFabric è semplice e facile da utilizzare e l'API del server offre una completa Distributed Resource Manager (DRM) che consentono di gestire uno o più server di cache (con più server che comprende un cluster cache). Ogni server fornisce la propria quota di memoria, serializzazione di oggetti e trasporto, area raggruppamento, basato su tag ricerca e scadenza. I server di cache supportano anche la disponibilità elevata, una funzionalità che crea l'oggetto repliche sul server secondario.
Numero di giugno 2009 di di MSDN Magazine include un'ottima Introduzione a Windows Server AppFabric da Aaron Dunnington (msdn.microsoft.com/magazine/dd861287). In questo articolo verrà illustrato come integrare AppFabric caching in applicazioni Web e desktop. Lungo il percorso verrà forniscono alcune procedure consigliate e offrire alcuni suggerimenti per sfruttare i vantaggi delle nuove funzionalità di Microsoft .NET Framework 4 e 4 di ASP.NET. Si apprenderà inoltre come risolvere problemi comuni che si verificano quando si utilizza una cache distribuita.
Tutti gli esempi di codice che seguono provengono da una soluzione completa demo chiamata Shop velocità, disponibile su CodePlex all'indirizzo velocityshop.codeplex.com .
Si noti che Windows Server AppFabric, che verrà illustrato in questo articolo, è diversa dalla piattaforma Windows Azure AppFabric. Per ulteriori informazioni sulla tecnologia Windows Azure, vedere microsoft.com/windowsazure/appfabric .
in Windows 7
È possibile installare la versione corrente beta 2 aggiornamento di Windows Server AppFabric in modi diversi per lo sviluppo. Il programma di installazione di piattaforma Web (microsoft.com/web/downloads) consente di impostare facilmente una varietà di sviluppo applicazioni e infrastrutture mediante un'unica installazione configurabile. Come bonus, il programma di installazione di piattaforma Web viene aggiornato per includere nuove versioni delle applicazioni supportate e infrastrutture.
Chi desidera installare AppFabric troverà un collegamento alla versione più recente della pagina Windows Server AppFabric di Windows Server Developer Center all'indirizzo msdn.microsoft.com/windowsserver/ee695849 .
Dopo aver completato l'installazione, la cache AppFabric è quasi pronta all'uso. Il passaggio successivo consiste nel creare una cache denominata, un contenitore logico che consente di memorizzare i dati. Per eseguire questa operazione tramite il cmdlet New Cache in Windows PowerShell:
New-Cache -cacheName Catalog
Per iniziare a utilizzare AppFabric la cache dell'applicazione, aggiungere i riferimenti a CacheBaseLibrary.dll, CASBase.dll, CASMain.dll e ClientLibrary.dll nel progetto di Visual Studio.
La libreria client è semplice. Il codice riportato di seguito viene illustrato come accedere alla cache distribuita per accedere alla cache denominata e memorizzare o recuperare oggetti:
cacheCluster = new DataCacheServerEndpoint[1];
cacheCluster[0] = new DataCacheServerEndpoint(
"ServerName", 22233, "DistributedCacheService");
DataCacheFactory factory =
new DataCacheFactory(cacheCluster, true, false);
DataCache cache = factory.GetCache("Catalog");
// Putting a product in cache
cache.Put("Product100", myProduct);
// Getting Product from cache
Product p = (Product)cache.Get("Product100");
Prima di approfondire di caching AppFabric, è consigliabile iniziare con un po' di pianificazione. Il primo passaggio consiste nel considerare come imposterà la cache. Determina quale delle sue funzionalità sarà disponibile per l'applicazione.
Per iniziare, sarà necessario impostare una cache denominata del progetto, come illustrato in precedenza. Con tale posizione, è possibile impostare criteri di scadenza e notifica personalizzati. Di oggetti o insiemi potrebbero richiedere diverse durate della cache e deve (o forse non dovrebbe) normalmente essere rimosso dalla cache quando la pressione della memoria è elevato. Per impostare un timeout scadenza assoluta per una determinata cache denominato, utilizzare il parametro TTL con il cmdlet New Cache.
Con la cache denominata, puoi configurare aree. Questi si comportano come sottogruppi nella cache e può essere utilizzati per organizzare oggetti e semplificando il processo di ricerca di oggetti nella cache. Si supponga, ad esempio, che l'applicazione utilizza un catalogo di dispositivi elettronici. Potrebbe creare una cache di catalogo in cui prodotti dividono in aree denominate televisori, fotocamere digitali e lettori MP3. Per creare aree, è possibile eseguire solo in fase di esecuzione, utilizzare il metodo dataCache.CreateRegion e specificando un nome di regione:
// Always test if region exists;
try {
cache.CreateRegion("Televisions", false);
}
catch (DataCacheException dcex) {
// if region already exists it's ok,
// otherwise rethrow the exception
if (dcex.ErrorCode != DataCacheErrorCode.RegionAlreadyExists)
throw dcex;
}
Tenere presente che se una regione con stesso nome esiste già, un DataCacheException verrà generata, è necessario utilizzare un blocco try / catch appropriata.
Ma cosa succede se è necessario cercare i prodotti in base a una funzione? È possibile cercare un'altra funzionalità di AppFabric caching utile per che: ricerca basato su tag. Questa funzionalità è disponibile solo quando si utilizzano le aree e consente di collegare uno o parked più tag a ogni elemento nella cache per le ricerche successive.
Ad esempio, dire che si desidera trovare tutti i prodotti nell'area televisori dotati di tag “ LED pannello ” e “ 46 pollici ”. Utilizzare il metodo GetByAllTags specificando un elenco di DataCacheTags e che è. Ecco un esempio di ricerca basato su tag:
DataCacheServerEndpoint[] cacheCluster = GetClusterEndpoints();
DataCacheFactory factory =
new DataCacheFactory(cacheCluster, true, false);
DataCache cache = factory.GetCache("Catalog");
IEnumerable<KeyValuePair<string, object>> itemsByTag =
cache.GetObjectsByTag(
new DataCacheTag("LED-Panel"), "Televisions");
Quando l'introduzione di un livello di cache in un'applicazione esistente o nuova, esistono anche punti comuni che è necessario prendere in considerazione. Consente di identificare e classificare i tipi di dati sono ottimi candidati per il caching. Di seguito sono tre le categorie:
- Fare riferimento a dati che include dati di sola lettura che cambiano raramente, se, ad esempio un elenco di paesi, cataloghi di elementi comunemente stoccati o fogli dati di prodotto.
- Dati di attività che comprende i dati soggetti a modifiche su base per utente o per la sessione, ad esempio un carrello o un elenco desiderio.
- Dati di risorsa, ovvero informazioni che variano spesso ed sono soggetto a più di un tipo di attività dell'utente, quali le modifiche di inventario del prodotto effettuate dopo ordini di clienti luogo.
Questa classificazione è utile specificare i criteri di scadenza e di notifica per ogni denominata cache in modo da ottenere l'utilizzo razionale ed efficiente. Tenere presente che anche se il cluster è possibile aggiungere server di cache, memoria rimane sempre una risorsa limitata.
Ciclo di vita della cache
All'avvio dell'applicazione, la cache è vuota. Gli utenti verranno da colpire il sito, tuttavia. Come riscaldamento cache?
Con il criterio di cache inciso applicazioni abilitate all'utilizzo della cache devono essere in grado di passare in un archivio permanente, ad esempio un database di SQL Server, quando i dati richiesti non sono nella cache. Potrebbe trattarsi di un'operazione costosa in scenari di dati in modo intensivo, specialmente quando si lavora con grandi quantità di dati di riferimento o quando non è garantita l'univocità del carico della cache. Può essere un punto quando più thread, al termine del test nella cache di un oggetto, il tentativo di caricare i dati dall'archivio e parks i dati nella cache per le richieste successive. Pertanto, si possono causare riduzioni di prestazioni dal recupero dei dati non memorizzati nella cache e la memorizzazione nella cache dei dati più spesso di necessità.
Ciò risulta simile a IIS 7.5 avvio automatico del servizio potrebbe essere utile. Con AppFabric è possibile utilizzare un blocco di lettura per ottenere risultati simili. Per attivare l'avvio automatico del servizio, è necessario applicare alcune modifiche al file applicationHost.config, come illustrato di seguito:
<serviceAutoStartProviders>
<add name="PrewarmMyApp"
type="MyWebApp.PreWarmUp, MyWebApp" />
</serviceAutoStartProviders>
Quindi caricare i dati di riferimento e risorse nella cache denominata implementando il metodo precarico con codice personalizzato:
using System.Web.Hosting;
namespace DemoApp {
public class WarmUp : IProcessHostPreloadClient {
public void Preload(string[] parameters) {
// Cache preload code here...
}
}
}
Ciò rende disponibili applicazioni Web solo dopo il completamento del metodo precarico.
In scenari di server farm come quella illustrata in di Figura 1, è necessario anche il problema di ogni avvio a freddo applicazione colpire l'archivio permanente per caricare la cache. La cache ASP.NET predefinito è legata il dominio applicazione in cui viene eseguita l'applicazione, in modo che si otterranno solo l'inizio del caricamento nella cache una volta. In AppFabric, tuttavia, la cache è condivisa tra server Web e di conseguenza, più applicazioni Web, devono essere evitati in modo simultanei tentativi di caricamento della cache.
Figura 1 di Cache AppFabric in una server farm
Sono disponibili diverse opzioni per la delega del carico della cache per un singolo server. Una funzionalità introdotta in AppFabric beta 1 è il blocco di lettura. Ciò consente di bloccare la chiave di un'elemento nella cache prima di essere aggiunto alla cache. Il primo codice precarico blocca la chiave sarà l'unico per avviare il caricamento dei dati associati. È ad esempio chiavi di prenotazione prima di utilizzarli durante il caricamento della cache. La tecnica consente di distribuire le operazioni di caricamento della cache su server Web. È possibile configurare ogni server in anticipo per caricare i dati associati a determinati tasti prenotati.
Sapere quando viene caricata la cache è un tipico problema di sincronizzazione con le risorse distribuite come cluster di cache. Con la cache AppFabric esistono numerosi metodi per determinare quando la cache è pronta. Una tecnica consiste nell'avere server esegue il polling di tasti comuni dopo il caricamento delle proprie prenotati i dati della chiave. Altre opzioni includono sottoscrivere una notifica della cache per l'internazionalizzazione o anche eseguendo la fase precarico in un servizio separato o applicazione, poiché la cache è ora distribuita e accessibile dal Web e applicazioni desktop.
Inoltre, è possibile sfruttare la classe .NET Framework 4 System.Threading.Tasks.Parallel per parallelizzare le operazioni di caricamento della cache, come illustrato in di Figura 2.
Figura 2 Cache Parallel caricamento
// load catalog items from DB
SQLServerCatalogProvider SQLServerCatalogProvider =
new SQLServerCatalogProvider();
itemsInCategory =
SQLServerCatalogProvider.GetItemsByCategoryId(categoryId);
_helper.CreateRegion(categoryId);
Parallel.ForEach(itemsInCategory, item =>{
// put each catalog item in cache with tags
if (item.Tags==string.Empty)
_helper.PutInCache(item.ProductId, item, categoryId);
else
_helper.PutInCache(item.ProductId, item, categoryId, item.Tags);
});
// Code from Helper class
public void PutInCache(string key, object value,
string region, string tags) {
List<DataCacheTag> itemTags = new List<DataCacheTag>();
foreach (var t in tags.Split(',').ToList())
itemTags.Add(new DataCacheTag(t.ToLower()));
_cache.Put(key, value, itemTags , region);
}
Una funzionalità tramite cache è pianificata per una futura versione di caching AppFabric. Ciò consentirebbe di eseguire automaticamente il codice personalizzato per caricare la cache quando i dati non sono presenti e viceversa, per salvare i dati in un archivio permanente quando informazioni sono state aggiornate nella cache.
Integrazione di ASP.NET
Il modello di provider ASP.NET consente agli sviluppatori di scegliere tra tre provider di sessione: InProc StateServer e SQL Server. Con la cache AppFabric, un provider di sessione quarto è tecnicamente disponibile ma fare attenzione a non confondere la sessione con cache. Cache sul miglioramento di prestazioni, sessione riguarda la creazione di un'applicazione di tipo Stateful Inspection.
Provider sessione AppFabric caching ASP.NET utilizza relativo distribuita e potenzialmente altamente disponibile, cache come archivio per le sessioni ASP.NET. Questo è trasparente e disponibile senza interrompere il codice esistente. Con tali provider consente una sessione ASP.NET sopravvivere se il server Web si blocca o non in linea, passa le sessioni sono stored fuori processo nella cache AppFabric.
Una volta che la cache AppFabric viene installata e configurata, è necessario creare una cache denominata per la memorizzazione delle sessioni ASP.NET. È possibile attivare DataCacheSessionStoreProvider modificando Web.config, come mostrato in di Figura 3.
Figura 3 attivazione sessioni ASP.NET nella Cache AppFabric
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="dataCacheClient"
type="Microsoft.Data.Caching.DataCacheClientSection, CacheBaseLibrary"
allowLocation="true" allowDefinition="Everywhere"/>
<section name="fabric"
type="System.Data.Fabric.Common.ConfigFile, FabricCommon"
allowLocation="true" allowDefinition="Everywhere"/>
<!-- Velocity 1 of 3 END -->
</configSections>
<dataCacheClient deployment="routing">
<localCache isEnabled="false"/>
<hosts>
<!--List of services -->
<host name="localhost" cachePort="22233"
cacheHostName="DistributedCacheService"/>
</hosts>
</dataCacheClient>
<fabric>
<section name="logging" path="">
<collection name="sinks" collectionType="list">
<!--LOG SINK CONFIGURATION-->
<!--defaultLevel values: -1=no tracing;
0=Errors only;
1=Warnings and Errors only;
2=Information, Warnings and Errors;
3=Verbose (all event information)-->
<customType
className="System.Data.Fabric.Common.EventLogger,FabricCommon"
sinkName="System.Data.Fabric.Common.ConsoleSink,FabricCommon"
sinkParam="" defaultLevel="-1"/>
<customType
className="System.Data.Fabric.Common.EventLogger,FabricCommon"
sinkName="System.Data.Fabric.Common.FileEventSink,FabricCommon"
sinkParam="DcacheLog/dd-hh-mm" defaultLevel="-1"/>
<customType
className="System.Data.Fabric.Common.EventLogger,FabricCommon"
sinkName="Microsoft.Data.Caching.ETWSink, CacheBaseLibrary"
sinkParam="" defaultLevel="-1"/>
</collection>
</section>
</fabric>
<appSettings/>
<connectionStrings/>
<system.web>
<sessionState mode="Custom" customProvider="Velocity">
<providers>
<add name="Velocity"
type="Microsoft.Data.Caching.DataCacheSessionStoreProvider, ClientLibrary"
cacheName="session"/>
</providers>
</sessionState>
...
È possibile integrare AppFabric cache nelle applicazioni ASP.NET 3.5 esistenti perché solo la parte server richiede .NET Framework 4, ma la libreria client funziona con .NET Framework 3.5 e 4.
Un altro punto di estendibilità di ASP.NET 4 è la cache di output. Poiché ASP.NET 1.0 è stata in grado di memorizzare l'output di pagine e controlli generato in una cache in memoria. Per ottenere questo output di memoria anziché generare nuovamente le richieste successive. ASP.NET 4 supporta la configurazione di uno o più provider della cache di output personalizzato. Un provider di cache di output AppFabric saranno disponibile dopo il rilascio di ASP.NET 4 e ruotare personalizzati estendendo la classe OutputCacheProvider e modificando Web.config per attivarla.
Integrazione di ORM
Più modelli di mapping relazionale a oggetti (ORM) forniscono una funzionalità denominata cache di secondo livello, un archivio che contiene entità, insiemi e i risultati della query per un periodo di tempo configurabile. Quando un'entità deve essere caricata dall'archivio permanente, la metodologia ORM verifica innanzitutto nella cache di secondo livello per controllare se l'entità è già caricato. In questo caso, un'istanza dell'entità richiesta viene passata al codice chiamante senza raggiungere il database.
Ogni implementazione ORM ha una propria strategia per la gestione delle associazioni di entità, insiemi e i risultati della query e questo è altrettanto vero della cache di secondo livello. Seconda ORM impiego, è probabile che le opzioni per la personalizzazione e l'utilizzo della cache di secondo livello sono limitate e che si sono forza in un particolare approccio nell'utilizzo della cache delle modifiche. Ad esempio se la scadenza dei criteri e cache dipendenze sono difficili da personalizzare, oggetto contesa può aumentare e riduce l'efficienza della cache.
NHibernate ed Entity Framework, è possibile utilizzare la memorizzazione nella cache AppFabric come una cache di secondo livello. Nhibernate consente questa funzionalità tramite nhibernate.caches.velocity (sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/). Entity Framework consente a EFCachingProvider da Jaroslaw Kowalski (code.msdn.microsoft.com/EFProviderWrappers).
Mettere AppFabric lavoro
Come si è visto, la memorizzazione nella cache di Windows Server AppFabric semplifica attivare la cache di voto cluster in qualsiasi applicazione nuova o esistente. Per ottenere tutti i vantaggi di una cache, è necessario identificare gli oggetti di dati candidato a destra, ma è possibile che già che per la cache del server locale. Sarà inoltre necessario un criterio di scadenza e notifica.
AppFabric è disponibile una licenza di Windows Server 2008 ed è anche disponibile per il download (msdn.microsoft.com/windowsserver/ee695849). Inoltre sarà presente il ruolo di cache in Windows Azure.
Scaricare AppFabric, configurare il cluster cache singolo o multiserver e se lo si desidera, scaricare ed eseguire Shop velocità su CodePlex per valutare rapidamente e usufruire di tutte le funzionalità AppFabric dimostrate all'interno della soluzione.
Andrea Colaci è un consulente e trainer con oltre 10 anni di esperienza. Ha una forte curiosità e una passione per le lingue più recenti e sviluppo strumenti.
Grazie all'esperto tecnica seguente per la revisione di questo articolo: Scott Hanselman