Dieser Artikel wurde maschinell übersetzt.

AppFabric-Cache

Nutzung und Integration in der Praxis

Andrea Colaci

Microsoft Windows Server AppFabric früher mit dem Codenamen “ Geschwindigkeit, ” bietet einen verteilten Cache, den Sie in Web- und desktop-Anwendungen integrieren können. AppFabric kann Leistung, Skalierbarkeit und Verfügbarkeit beim, aus Sicht des Entwicklers verbessern verhält wie ein allgemeiner Zwischenspeicher. Sie können eine beliebige serialisierbares Objekt, einschließlich DataSets, Datentabellen, binäre Daten, XML, benutzerdefinierte Entitäten und Daten übertragen Objekte zwischenspeichern.

AppFabric-Client-API ist einfach und leicht zu verwenden und die Server-API bietet eine umfassende Distributed Resource Manager (DRM), die einem oder mehreren Cacheservern mit (mit mehreren Servern, die Cache-Cluster bilden) verwalten können. Jeder Server enthält eine eigene Arbeitsspeicherkontingent, Objektserialisierung und Transport, Region gruppieren, Tags basierte Suche und Ablaufdatum. Die Cache-Server unterstützen auch die hohen Verfügbarkeit, ein Feature, das Objekt Replikate auf sekundären Servern erstellt.

Der MSDN Magazine Juni 2009-Ausgabe enthält eine gute Einführung in Windows Server AppFabric von Aaron Dunnington (msdn.microsoft.com/magazine/dd861287 ). In diesem Artikel werde ich Erläutern von AppFabric Zwischenspeicherung in Desktop- und Webanwendungen integrieren. Entlang der Route werde ich einige bewährten Methoden bereitstellen und erhalten einige Tipps für die Vorteile der neuen Features in Microsoft .NET Framework 4 und 4 von ASP.NET. Außerden lernen Sie, wie Sie häufig auftretende Probleme zu lösen, die bei der Verwendung von verteilten-Caches auftreten.

Alle Codebeispiele, die Folgen stammen aus einer vollständigen Demo Lösung auf CodePlex velocityshop.codeplex.com-verfügbar-Geschwindigkeit Shop aufgerufen.

Beachten Sie, dass sich Windows Server AppFabric, die ich in diesem Artikel erläutert wird, von der Plattform Windows Azure AppFabric unterscheidet. Weitere Informationen zur Windows-Azure-Technologie finden Sie unter microsoft.com/windowsazure/appfabric-.

Erste Schritte

Sie können die aktuelle Beta 2 installieren aktualisieren von Windows Server AppFabric verschiedene Möglichkeiten für die Entwicklung. Web Platform Installer (microsoft.com/web/downloads ) ermöglicht es Ihnen, auf einfache Weise eine Vielzahl von der Entwicklung von Webanwendungen und Frameworks über eine einzige konfigurierbare Installation einrichten. Als Bonus ist Web Platform-Installer die neuen Versionen des Frameworks und unterstützte Anwendungen aktualisiert.

Diejenigen, die nur AppFabric installieren möchten finden Sie eine Verknüpfung mit der aktuellen Version der Windows Server-Entwicklercenter msdn.microsoft.com/windowsserver/ee695849-auf der Seite Windows Server AppFabric.

Nach Abschluss des Setups ist die Zwischenspeicherung AppFabric fast einsatzbereit. Der nächste Schritt ist die Erstellung einen benannten Cache ein logischer Container, der zum Speichern von Daten verwendet. Dies erfolgt über das Cmdlet neu-Cache in Windows PowerShell:

New-Cache -cacheName Catalog

Um zu AppFabric Zwischenspeichern in Ihrer Anwendung verwenden, fügen Sie die Verweise auf CacheBaseLibrary.dll, CASBase.dll, CASMain.dll und ClientLibrary.dll einfach im Visual Studio-Projekt.

Die Clientbibliothek ist einfach. Der folgende Code zeigt das verteilten Cache benannten Cache zugreifen und speichern oder Abrufen von Objekten zugreifen:

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");

Bevor Sie in die Zwischenspeicherung AppFabric eintauchen, ist es empfehlenswert, mit ein wenig Planung starten. Der erste Schritt ist zu berücksichtigen, wie Sie den Zwischenspeicher eingerichtet werden. Legt fest, welche Funktionen Ihrer Anwendung zur Verfügung gestellt werden.

Um zu beginnen, sollten Sie einen benannten Cache für Ihr Projekt festgelegt, wie bereits erwähnt. Mit dem vorhanden können Sie benutzerdefinierte Ablaufdatum und Benachrichtigung Richtlinien festlegen. Ihre Objekte oder Auflistungen erfordern unterschiedliche Cache dauern und sollte (oder vielleicht sollte nicht) werden ordnungsgemäß aus dem Cache entfernt bei hohem Speicherdruck. Einen absolute Ablaufzeit Timeout für einen bestimmten benannten Cache festlegen möchten, verwenden Sie den TTL-Parameter mit dem New-Cache-Cmdlet.

Zusammen mit den benannten Cache sollten Sie Regionen zu konfigurieren. Diese Verhalten sich wie Untergruppen im Cache und zum Verwalten von Objekten und vereinfacht den Prozess zum Suchen von Objekten im Cache verwendet werden können. Genommen Sie an, meine Anwendung einen Katalog der Consumer Electronics Geräte verwendet. In dem ich meine Produkte Fernsehgeräte, MP3-Player und Kameras bezeichnet Bereiche aufteilen konnte ein Caches Katalog erstellt werden. Regionen, erstellen Sie nur zur Laufzeit ersetzt werden können, verwenden Sie die dataCache.CreateRegion-Methode und einen Regionsnamen angeben:

// 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;
}

Beachten Sie, dass eine DataCacheException ein Bereich mit demselben Namen bereits vorhanden, ausgelöst wird, behalten Sie bei, daher müssen Sie einen entsprechenden Try-Catch-Block verwenden.

Aber was passiert, wenn Sie für die Produktsuche für einzelne Features benötigen? Ein weiteres Feature von AppFabric finden Sie Zwischenspeichern nützlich für, die: Tag-basierte Suche. Dieses Feature steht nur bei Verwendung von Regionen, und können Sie fügen Sie eine oder mehrere Tags für jedes Element im Cache für nachfolgende Suchvorgänge parked.

Z. B. möchte sagen ich alle Produkte in der Region Fernsehgeräte, die “ LED-Systemsteuerung ” und “ 46 Zoll ” Tags zu suchen. Ich verwende die GetByAllTags-Methode eine Liste der DataCacheTags angeben, und ist es. Hier ist ein Beispiel für Tags basierte Suche:

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");

Wenn eine Cache-Ebene in eine vorhandene oder eine neue Anwendung einführen, sind auch allgemeine Punkte, die Sie berücksichtigen müssen. Sie können zum Identifizieren und Klassifizieren von Datentypen, die gute Kandidaten für die Zwischenspeicherung sind. Es folgen drei Kategorien:

  • Verweisen auf Daten, das schreibgeschützte Daten, die nur selten ändert umfasst, wenn überhaupt, z. B. eine Liste der Länder, Kataloge häufig stocked Elemente oder Produkt Datenblätter.
  • Aktivitätsdaten enthält alle Daten jeweils pro Benutzer oder pro Sitzung, wie z. B. einen Warenkorb oder eine Wunschliste vorbehalten.
  • Ressourcendaten, d. h. Informationen, der oft unterschiedlich sein können und unterliegt den mehr als eine Art der Benutzeraktivität, wie z. B. Produkt Lager Änderungen, die nach Bestellungen von Kunden Ort vorgenommen werden.

Diese Klassifikation eignet sich zum Ablaufdatum und Benachrichtigungsrichtlinien angeben, für die einzelnen Namens Cache so effizient und rational Ressourcennutzung erhalten werden können. Denken Sie daran, dass auch dann, wenn Sie Cache-Server zum Cluster hinzufügen können, Speicher immer eine begrenzte Ressource bleibt.

Cache-Lifecycle

Wenn Ihre Anwendung gestartet wird, ist der Cache leer. Benutzern werden die Website jedoch treffen. Wie Warmes Sie den Cache?

Mit dem Cache-Aside-Muster müssen Cache-fähigen Anwendungen möglicherweise zu permanenten Speicher, z. B. eine SQL Server-Datenbank zu wechseln, wenn die angeforderten Daten nicht im Cache befindet. Dies könnte eine teure Schritt in datenintensiven Szenarien sein, insbesondere beim Umgang mit großen Datenmengen auf Daten verweisen, oder wenn die Eindeutigkeit der Cacheload garantiert ist nicht. Bei mehr als einem Thread, nachdem Sie den Cache auf ein Objekt versucht, Daten aus dem Speicher zu laden und die Daten im Cache für nachfolgende Anforderungen parks möglicherweise ein Punkt vor. So kann ein aus nicht zwischengespeicherte Daten abrufen und Zwischenspeichern von Daten öfter als nötig Leistungseinbußen entstehen.

Dies ist bei etwa IIS 7.5 Autostart-Dienst nützlich, in sein würde. Mit AppFabric können Sie eine Lesesperre erhalten Sie ähnliche Ergebnisse einsetzen. So aktivieren Sie den Dienst automatisch zu starten, haben Sie einige Änderungen Zuweisen von "applicationHost.config", wie hier gezeigt:

<serviceAutoStartProviders>
  <add name="PrewarmMyApp" 
       type="MyWebApp.PreWarmUp, MyWebApp" />
</serviceAutoStartProviders>

Nächstes Laden Sie durch Implementieren der Preload-Methode mit benutzerdefiniertem Code Referenz und Resource Daten im Cache mit dem Namen:

using System.Web.Hosting;
namespace DemoApp {
  public class WarmUp : IProcessHostPreloadClient {
    public void Preload(string[] parameters) {
      // Cache preload code here...
    }
  }
}

Dadurch werden Webanwendungen nur nach Abschluss der Methode Preload verfügbar.

In Szenarien wie dargestellt in Abbildung 1 Server-Farm müssen Sie auch das Problem der einzelnen Cold starten Anwendungen permanenten Speicher auf seinem Cache geladen werden. Der Standardcache für ASP.NET ist für die Anwendungsdomäne, in der die Anwendung ausgeführt wird, gebunden, so, dass Sie nur den Treffer im Cache einmal laden erhalten. In AppFabric jedoch ist der Cache über Webserver hinweg freigegeben, und daher über Webanwendungen, also gleichzeitige Cacheload Versuche sollte vermieden werden.

image: AppFabric Cache in a Server Farm
Abbildung 1 AppFabric-Cache in einer Serverfarm

Es gibt mehrere Optionen für das Delegieren der Cacheload auf einem einzelnen Server. Eine Funktion, die eingeführten AppFabric Beta 1 ist die Lesesperre. Auf diese Weise können Sie einen Element im Cache Schlüssel zu sperren, bevor Sie es dem Cache hinzugefügt wird. Erste preload Code, der den Schlüssel sperrt werden die einzige Starten laden Daten zugeordnet. Dies ist z. B. Buchung Schlüssel vor der Verwendung während der Cacheload. Die Technik können Sie auch die Cacheload Operationen auf Webservern zu verteilen. Konfigurieren Sie jeden Server im voraus, um bestimmte gebucht Schlüssel zugeordneten Daten zu laden.

Zu wissen, wann der Cache geladen wird, ist ein häufiges Problem der Synchronisierung mit verteilten Ressourcen wie z. B. Cache-Cluster. Zwischenspeichern der AppFabric stehen Ihnen eine Reihe von Methoden für die Bestimmung, wenn der Cache bereit ist. Ein Verfahren besteht darin, Server gemeinsamen Schlüssel abzurufen, nachdem beim Laden Ihrer eigenen Schlüsseldaten gebucht haben. Weitere Optionen sind, eine Cache-Ready-Benachrichtigung abonnieren oder sogar preload Phase ausführen, in einem separaten Dienst oder eine Anwendung, der Cache jetzt verteilt wird und über Web- und Desktopanwendungen.

Darüber hinaus können Sie die .NET Framework 4 System.Threading.Tasks.Parallel-Klasse, um die Cache-Last-Operationen zu parallelisieren, wie in Abbildung 2 nutzen.

Abbildung 2 Parallel Cache laden

// 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);
}

Ein Cache über-Feature ist für eine zukünftige Version der Zwischenspeicherung AppFabric geplant. Auf diese Weise können Sie für die automatische Ausführung von benutzerdefinierten Code in den Cache geladen werden, wenn Daten nicht vorhanden ist und umgekehrt, um Daten in permanenten Speicher speichern, wenn Informationen im Cache aktualisiert wurde.

ASP.NET-Integration

Das ASP.NET-Anbietermodell kann Entwickler aus drei Sitzung Anbieter auswählen: InProc StateServer und SQLServer. Zwischenspeichern der AppFabric ein vierter Sitzung Anbieter ist technisch verfügbar, aber nicht zu verwechseln mit Cache-Sitzung werden. Cache wird zum Verbessern der Darbietungen, Sitzung über eine statusbehaftete Anwendung vornehmen.

Der Zwischenspeicherung AppFabric Sitzung Anbieter für ASP.NET verwendet die verteilte – und potenziell hoch verfügbar – Cache als Repository für ASP.NET Sitzungen. Dies ist transparent und verfügbar, ohne vorhandenen Code zu unterbrechen. Müssen einen solchen Provider ermöglicht eine ASP.NET-Sitzung zu überstehen, wenn der Server abstürzt oder offline geht da Sitzungen gespeicherten Out-of-Process im Cache AppFabric sind.

Nach dem Zwischenspeichern AppFabric installiert und konfiguriert ist, müssen Sie einen benannten Cache zum Speichern von ASP.NET Sitzungen erstellen. Dann können Sie DataCacheSessionStoreProvider aktivieren, indem Sie Web.config ändern, wie in Abbildung 3 .

Abbildung 3 Aktivieren ASP.NET-Sitzungen im 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>
...

Sie können die AppFabric Zwischenspeichern in vorhandene ASP.NET 3.5 Anwendungen, da nur die Serverseite die .NET Framework-4 erfordert, aber die Clientbibliothek mit .NET Framework 3.5 und 4 arbeitet integrieren.

Ein weiteres Erweiterungspunkt für ASP.NET 4 ist Ausgabecache. Seit ASP.NET 1.0 wurde es die generierte Ausgabe von Seiten und Steuerelementen in einem Cache im Arbeitsspeicher speichern können. Nachfolgende Anforderungen erhalten diese Ausgabe von Speicher anstatt erneut zu generieren. ASP.NET 4 unterstützt die Konfiguration der Anbieter für ein oder mehrere benutzerdefinierte Ausgaben-Cache. Ein AppFabric Ausgabe Cache-Provider werden nach der Veröffentlichung von ASP.NET 4 zur Verfügung stehen, und Würfeln Sie Ihren eigenen durch die OutputCacheProvider-Klasse erweitern und Ändern von "Web.config" zu aktivieren.

ORM-Integration

Beliebteste objektrelationales Mapping (ORM)-Frameworks bieten ein Feature namens „ Second-Level-Cache ist ein Repository, die Entitäten, Auflistungen und Abfrageergebnisse für einen konfigurierbaren Zeitraum gespeichert. Wenn eine Entität aus dem permanenten Speicher geladen werden, überprüft der ORM-zuerst Second-Level-Cache, um zu überprüfen, ob die Entität bereits geladen ist. Ist dies der Fall ist, wird eine Instanz der angeforderte Entität an den aufrufenden Code übergeben, ohne auf die Datenbank.

Jede ORM-Implementierung verfügt über eine eigene Strategie für den Umgang mit Entität Assoziationen, Auflistungen und Abfrage-Ergebnisse, und dies gilt gleichermaßen für Second-Level-Cache. Abhängig von der ORM-Sie einsetzen, vielleicht Sie, dass die Optionen für die Anpassung und die Nutzung der Second-Level-Cache beschränkt sind und Sie Sie in einen bestimmten Ansatz im Cache Änderungen verbraucht erzwingen. Wenn Ablaufdatum Richtlinie und Cache Abhängigkeiten nur schwer anpassen, Objekt-Konflikten kann zunehmen und Cache Effizienz verringert.

Sowohl NHibernate und Entity Framework können AppFabric als zweiter Ebene Cache Zwischenspeichern. Nhibernate ermöglicht diese Funktion über nhibernate.caches.velocity (sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/ ). Entity Framework ermöglicht es, über EFCachingProvider durch Jaroslaw Kowalski (code.msdn.microsoft.com/EFProviderWrappers ).

Einfügen von AppFabric arbeiten

Wie Sie gesehen haben, vereinfacht Windows Server AppFabric caching Zwischenspeichern der Cluster-Grade in einer neuen oder vorhandenen Anwendung aktiviert. Um alle Vorteile eines Caches zu erhalten, müssen Sie die richtigen Kandidaten Datenobjekte zu identifizieren, aber möglicherweise haben bereits getan, die für das Zwischenspeichern auf dem lokalen Servers. Darüber hinaus müssen Sie eine Richtlinie Ablauf- und Benachrichtigung.

AppFabric mit einer Lizenz für Windows Server 2008 verfügbar ist und für den Download (msdn.microsoft.com/windowsserver/ee695849 ) zur Verfügung steht. Es wird auch als Cache-Funktion in Windows Azure vorhanden sein.

Downloaden Sie AppFabric, richten Sie Ihre einzelnen oder mehreren Servern Cache-Cluster und wenn Sie möchten, downloaden Sie und führen Sie Shop-Geschwindigkeit auf CodePlex schnell auswerten und genießen Sie alle AppFabric Features veranschaulicht, die innerhalb der Projektmappe.

Andrea Colaci ist der Berater und Trainer mit mehr als 10 Jahre Erfahrung. Er verfügt über einen starken Neugier und eine Leidenschaft für den neuesten Sprachen und Development Tools.

Dank an den folgenden technischen Experten für die Überprüfung der in diesem Artikel: Scott Hanselman