Scale-Out-Lösung
Verteilte Zwischenspeicherung auf dem Weg zur Skalierbarkeit
Iqbal Khan
Themen in diesem Artikel:
-
Verteiltes Zwischenspeichern
-
Skalierbarkeit
-
Die Datenbanksynchronisierung
|
In diesem Artikel werden die folgenden Technologien verwendet:
ASP.NET XML-Webdienste, HPC-Anwendungen
|

Inhalt
Wenn Sie ein ASP.NET entwickeln sind Anwendung, Webdienste oder eine High-Performance computing (HPC) Anwendung, wahrscheinlich Sie großen Skalierbarkeit Probleme auftreten, wie Sie versuchen, Skalieren und weitere Last auf Ihre Anwendung.
Mit einer XML-Webdienste Anwendung Engpässe treten in beiden Datenspeichern.
Die erste ist der Anwendungsdaten, die in der Datenbank befindet, und die andere ist XML-Webdienste Sitzung Status Daten, die normalerweise in einem von drei Modi (InProc, SqlServer oder StateServer) von Microsoft bereitgestellten gespeichert sind.
Alle drei müssen wichtige Skalierbarkeitsprobleme.
Webdienste verwenden normalerweise keine Sitzungszustand, Sie verfügen jedoch über Skalierbarkeit Engpässe bei Anwendungsdaten.
Wie ASP.NET-Anwendungen können XML-Webdienste in IIS gehostet und in einer Webfarm für Skalierbarkeit bereitgestellt werden.
HPC-Anwendungen, die Verarbeitungsschritte umfangreichen parallelen auch entwickelt werden, haben Skalierbarkeitsproblemen, da im Datenspeicher nicht auf dieselbe Weise skaliert wird.
HPC (auch als Raster computing bezeichnet) wurde traditionell Java verwendet, aber als .NET Gewinne Marktanteil, gewinnt er beliebter für HPC-Anwendungen sowie.
HPC-Anwendungen Hunderte und manchmal Tausende von Computern für die parallele Verarbeitung bereitgestellt werden, und werden häufig auf große Mengen von Daten und Freigabe Zwischenergebnisse mit anderen Computern ausgeführt werden müssen.
HPC-Anwendungen verwenden eine Datenbank oder ein freigegebenes Dateisystem als Datenspeicher, und beide nicht sehr gut skalieren.
Verteilte Zwischenspeicherung
Zwischenspeicherung ist ein bekannter Konzept in Hardware und Software Welten.
Traditionell Zwischenspeichern eines eigenständigen Mechanismus wurde, jedoch ist nicht mehr in den meisten Umgebungen brauchbare da Anwendungen jetzt auf mehreren Servern und in mehreren Prozessen innerhalb der einzelnen Server ausgeführt.
Im Arbeitsspeicher verteilte Zwischenspeicherung ist ein Formular der Zwischenspeicherung, das ermöglicht es den Cache mehrere Server erstrecken, sodass in Größe und transaktionale Kapazität vergrößert werden können.
Verteilte Zwischenspeicherung ist jetzt möglich, eine Reihe von Gründen geworden.
Zunächst Speicher sehr kostengünstig geworden und Sie können Computer mit viele Gigabyte zu throwaway Preisen Dinge.
Zweitens sehr schnell verschafft Traction 10Gbit mit 1Gbit jetzt überall Standard geworden Netzwerkkarten.
Verteiltes im Gegensatz zu einem Datenbankserver in der Regel einen High-End-Computer erfordert schließlich Zwischenspeichern funktioniert gut auf niedrigeren Kosten Computern (wie zum Webserver), dem Sie mehrere Computer problemlos hinzufügen können.
Verteilte Zwischenspeicherung ist wegen der Architektur, die es nutzt skalierbar.
Er verteilt die Arbeit auf mehrere Server jedoch weiterhin erhalten Sie eine logische Ansicht eines einzelnen Caches.
Für Anwendungsdaten bewahrt ein verteilter Cache eine Kopie einer Teilmenge der Daten in der Datenbank.
Dies soll einem temporären Speicher, der Stunden, Tage oder Wochen bedeuten kann.
In vielen Fällen muss die in einer Anwendung verwendeten Daten nicht dauerhaft gespeichert werden.
In XML-Webdienste, ist z. B. Sitzungsdaten temporäre und erforderlichen vielleicht ein paar Minuten zu ein paar Stunden höchstens.
Ebenso in HPC, große Teile der Verarbeitung erfordert intermediate Daten in einem Datenspeicher gespeichert, und dies ist auch temporäre Natur.
Das endgültige Ergebnis der HPC könnte jedoch in einer Datenbank gespeichert werden.
Abbildung 1 zeigt eine typische Konfiguration eines verteilten Caches in einem Unternehmen.
Abbildung 1 verteilt Cache Shared von verschiedenen Anwendungen in einer Enterprise- (auf das Bild für eine größere Ansicht klicken.)
Muss haben Features in verteilten Cache
Bisher haben Entwickler berücksichtigt, die Zwischenspeicherung nur statischer Daten, Daten von Bedeutung, die während der gesamten Lebensdauer der Anwendung niemals ändert.
Aber, dass Daten in der Regel eine sehr kleine Teilmenge ist – vielleicht 10 % – Daten, die eine Anwendung verarbeitet.
Obwohl Sie statische Daten im Cache beibehalten können, der echte Wert stammt, wenn Sie dynamische oder Transaktionsnachrichten Daten zwischenspeichern können, Daten, die alle paar Minuten ändern, behält.
Sie Zwischenspeichern weiterhin es da innerhalb dieser Zeitspanne kann es zehntausenden von Zeiten abrufen und viele Schleifen in der Datenbank speichern.
Wenn Sie, die mit Tausenden von Benutzern, die versuchen multiplizieren, Operationen gleichzeitig ausführen, können Sie wie viele weniger Lesevorgänge angenommen, Sie in der Datenbank haben.
Aber wenn Sie dynamische Daten zwischenspeichern, hat der Cache, bestimmte Features entwickelt, um Datenintegritätsprobleme zu verhindern.
Ein typischer Cache sollten Funktionen für ablaufen und Entfernen von Elementen sowie andere Funktionen verfügen.
Ich werde diese Features in den folgenden Abschnitten untersuchen.
Ablaufzeiten
Ablaufzeiten sind am Anfang der Liste.
Sie können angeben, wie lange Daten sollten im Cache bleiben, bevor der Cache automatisch entfernt.
Sie können zwei Arten von Ablaufzeiten angeben: Absolute Zeit Ablaufdatum und Variable Zeit (oder im Leerlauf Zeit) ablaufen.
Wenn die Daten in den Cache auch in einer master-Datenquelle vorhanden ist, wissen Sie, dass diese Daten geändert werden können in der Datenbank von Benutzern oder Anwendungen, die nicht in den Cache zugreifen können.
Wenn dies geschieht, werden die Daten im Cache veraltet.
Wenn Sie können zu schätzen, wie lange diese Daten problemlos im Cache gespeichert werden können, können Sie Absolute Zeit Ablaufdatum angeben – etwas wie, "dieses Element jetzt in 10 Minuten ablaufen"oder "Läuft ab heute um Mitternacht dieses Element."
Eine interessante Variante um absolute Ablaufzeit ist, ob eine aktualisierte Kopie das zwischengespeicherte Element direkt aus der Datenquelle der Cache geladen werden kann.
Dies ist möglich, nur, wenn der Cache eine Read-through stellt Features (siehe nachfolgenden Abschnitten) und ermöglicht Ihnen einen Read-through-Handler registrieren, die zwischengespeicherte Elemente, lädt tritt absolute Ablaufzeit.
Abgesehen von ein paar kommerzielle Caches unterstützen die meisten Caches dieses Feature nicht.
Leerlauf-Time (gleitende-Time) Ablaufdatum können Sie ein Element ablaufen, wenn es für einen bestimmten Zeitraum nicht verwendet wird.
Sie können wie "Ablaufen dieses Element" angeben, wenn niemand liest oder für 10 Minuten aktualisiert Dies ist sinnvoll Wenn Ihre Anwendung vorübergehend Daten benötigt, aber nach die Anwendung verwendet wird, soll den Cache automatisch es abläuft.
ASP.NET-Sitzungszustand ist ein guter Kandidat für Leerlauf Zeit ablaufen.
Absolute Zeit Ablaufdatum hilft Ihnen, Situationen zu vermeiden, in denen der Cache hat eine veraltete Kopie der Daten oder eine Kopie, die älter als die Masterkopie in der Datenbank ist.
Leerlauf Zeit ablaufen soll den Cache bereinigen, nachdem die Anwendung bestimmte Daten nicht mehr benötigt.
Anstatt die notwendige Bereinigung der Anwendung können Sie den Cache kümmern sich.
Räumungen
Die meisten verteilten Caches im Arbeitsspeicher sind und den Cache Datenträger nicht beibehalten.
Dies bedeutet, dass in den meisten Fällen Speicher beschränkt und die Cachegröße kann nicht vergrößert werden, über einen bestimmten Grenzwert, der verfügbare Gesamtarbeitsspeicher werden konnte oder viel kleiner als, wenn Sie andere Anwendungen auf demselben Computer ausgeführt haben.
In beiden Fällen ein verteilter Cache sollten Sie an eine maximale Cachegröße (im Idealfall hinsichtlich der Größe des Speichers) zulassen.
Wenn der Cache diese Größe erreicht, sollten Sie beginnen, Entfernen zwischengespeicherter Elemente um Platz für neue, einen Prozess in der Regel als Räumungen bezeichnet zu schaffen.
Räumungen werden basierend auf verschiedenen Algorithmen durchgeführt.
Die beliebtesten ist mindestens recently used (LRU), in denen die zwischengespeicherten Elemente, die für die längste Zeit nicht berührt wurden haben entfernt werden.
Einen anderen Algorithmus ist mindestens häufig verwendete (LFU).
Hier berührt die Elemente, die am wenigsten Anzahl werden entfernt.
Es sind ein paar andere Variationen, aber diese beiden sind die beliebtesten.
Zwischenspeichern von relationale Daten
Die meisten Daten stammen aus einer relationalen Datenbank, auch wenn nicht, ist relationalen Natur, d. h., dass verschiedene zu anderen zusammengehörige Daten sind jedoch – z. B. ein Customer-Objekt und ein Auftrag-Objekt.
Wenn Sie diese Beziehungen haben, müssen Sie diese in einem Cache zu verarbeiten.
Dies bedeutet im Cache die Beziehung zwischen einem Kunden und eine Bestellung kennen sollten.
Wenn Sie aktualisieren oder ein Kunden aus dem Cache entfernen, sollten Sie den Cache auch automatisch aktualisieren oder zugehörige Order-Objekte aus dem Cache entfernen.
Dadurch wird die Datenintegrität in vielen Situationen zu erhalten.
Aber erneut, wenn ein Cache nachverfolgen diese Beziehungen nicht möglich, müssen Sie ihn, und dadurch Ihre Anwendung noch viel mehr mühsam und komplexe.
Es ist viel einfacher, wenn Sie einfach der Cache auf die Daten immer hinzugefügt wird, ein Auftrag einem Debitor zugeordnet ist, und der Cache dann weiß, dass dieses Kunden aktualisiert oder entfernt, Orders auch haben aktualisiert oder aus dem Cache entfernt werden.
XML-Webdienste Cache verfügt über eine wirklich tolle Funktion, die CacheDependency, dem Sie Beziehungen zwischen anderen zwischengespeicherten Elementen der bezeichnet.
Einige kommerzielle Caches verfügen außerdem über dieses Feature.
Abbildung 2 zeigt ein Beispiel der Funktionsweise von XML-Webdienste Cache.

Abbildung 2 aktualisieren Nachverfolgen der Beziehungen zwischen zwischengespeicherten Elemente
using System.Web.Caching;
...
public void CreateKeyDependency()
{
Cache["key1"] = "Value 1";
// Make key2 dependent on key1.
String[] dependencyKey = new String[1];
dependencyKey[0] = "key1";
CacheDependency dep1 = new CacheDependency(null, dependencyKey);
Cache.Insert("key2", "Value 2", dep2);
}
Dies ist eine mehrschichtige Abhängigkeit, Bedeutung, dass A B und B abhängen kann kann auf c: abhängen
Damit, wenn Ihre Anwendung C entfernt, A und B aus dem Cache sowie entfernt werden.
Synchronisieren ein im mit anderen Umgebungen
Ablaufzeiten und Cacheabhängigkeit Features soll Ihnen den Cache aktuell und korrekt helfen.
Außerdem müssen Sie den Cache mit Datenquellen zu synchronisieren, auf die Sie und Ihren Cache zugreifen können nicht, so dass Änderungen in diesen Datenquellen im Cache neue beibehalten reflektiert werden.
Z. B. angenommen der Cache wird mit Microsoft .NET Framework geschrieben, jedoch Java oder C++-Anwendungen ändern von Daten in der master Datenquelle haben.
Möchten Sie diese Anwendungen, um den Cache benachrichtigen, wenn bestimmte Daten in den master-Datenquellen ändert, sodass Ihren Cache ein entsprechendes zwischengespeichertes Element für ungültig erklären kann.
Im Idealfall sollte der Cache diese Funktion unterstützen.
Wenn es nicht ist, fällt diese Last auf Ihre Anwendung.
XML-Webdienste Cache bietet dieses Feature durch CacheDependency, wie einige kommerziellen Lösungen zwischenspeichernden.
Sie können angeben, dass bestimmte zwischengespeicherte Element einer Datei abhängig und, bei jedem dieser Datei aktualisiert oder entfernt wird, der Cache dies erkennt und das zwischengespeicherte Element für ungültig erklärt.
Die Element erzwingt die Anwendung der aktuellsten Kopie dieses Objekts die nächste Abrufen Ihrer Anwendung Zeit ungültig benötigt er und nicht im Cache gefunden.
Wenn Sie 100.000 Elemente im Cache hatten, 10.000 davon möglicherweise Dateiabhängigkeiten und, Sie müssen möglicherweise 10.000 Dateien in einem speziellen Ordner.
Jede Datei verfügt über einen speziellen Namen, die das zwischengespeicherte Element zugeordnet.
Wenn eine andere Anwendung – ob oder nicht in .NET geschrieben – ändert die Daten in der master Datenquelle, die Anwendung in den Cache über eine Aktualisierung des Zeitstempels Datei kommunizieren können.
Datenbank-Synchronisierung
Die Notwendigkeit der Datenbanksynchronisierung entsteht, weil die Datenbank in mehreren Anwendungen gemeinsam genutzt wird wird, und nicht alle diese Anwendungen Zugriff auf den Cache haben.
Wenn Ihre Anwendung ist die einzige Anwendung Aktualisieren der Datenbank, und es kann auch einfach den Cache aktualisieren, müssen Sie nicht wahrscheinlich die Datenbank-Synchronisierung-Funktion.
In einer realen Umgebung, ist jedoch nicht immer der Fall.
Wenn die Daten der Datenbank eines Drittanbieters oder einer anderen Anwendung geändert wird, soll den Cache die Änderung widerzuspiegeln.
Der Cache spiegelt Änderungen wider, durch das Neuladen der Daten oder auf mindestens, dass keine älteren Daten im Cache.
Wenn der Cache eine alte Kopie und der Datenbank eine neue Kopie verfügt, haben Sie jetzt ein Datenproblem Integrität, da Sie nicht wissen, welche Kopie geeignet ist.
Natürlich, die Datenbank ist immer rechts, aber nicht immer rufen Sie die Datenbank.
Sie erhalten Daten aus dem Cache, da Ihre Anwendung vertraut, dass der Cache immer richtig sein oder, dass der Cache für seine Anforderungen korrekt genug wird.
Synchronisieren mit der Datenbank kann bedeuten verknüpfte Element im Cache ungültig, so, dass das nächste Mal, das die Anwendung, benötigt, es es aus der Datenbank abgerufen wird.
Eine interessante Variante zu diesem Prozess ist, wenn der Cache wird automatisch eine aktualisierte Kopie des Objekts, geladen wenn die Daten in der Datenbank geändert.
Dies ist jedoch möglich, wenn Sie der Cache einen Read-through-Handler bereitstellen kann (Siehe nächsten Abschnitt) und dann zum Laden des zwischengespeicherten Element aus der Datenbank verwendet.
Jedoch nur einige der professionellen Caches dieses Feature unterstützt, und führen Sie keine der frei.
XML-Webdienste Cache verfügt über ein SqlCacheDependency-Feature (siehe Abbildung 3), können Sie den Cache mit einer SQL Server 2005/2008, Oracle 10 g R2 oder höher Datenbankversion synchronisieren – im Grunde jede Datenbank, die die .NET CLR integriert verfügt.
Einige der professionellen Caches bieten auch diese Funktion.

Abbildung 3 verwenden SqlDependency mit einer relationalen Datenbank
using System.Web.Caching;
using System.Data.SqlClient;
...
public void CreateSqlDependency(Customers cust, SqlConnection conn)
{
// Make cust dependent on a corresponding row in the
// Customers table in Northwind database
string sql = "SELECT CustomerID FROM Customers WHERE ";
sql += "CustomerID = @ID";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@ID", System.Data.SqlDbType.VarChar);
cmd.Parameters["@ID"].Value = cust.CustomerID;
SqlCacheDependency dep = new SqlCacheDependency(cmd);
string key = "Customers:CustomerID:" + cust.CustomerID;
Cache.Insert(key, cust, dep);
}
XML-Webdienste Cache SqlCacheDependency können Sie eine SQL-Zeichenfolge entsprechend eine oder mehrere Zeilen in einer Tabelle in der Datenbank angeben.
Wenn diese Zeile ständig aktualisiert wird, löst das DBMS eine .NET-Ereignis, die der Cache abfängt.
Anschließend wird das zwischengespeichertes Element bezieht sich auf diese Zeile in der Datenbank und das zwischengespeicherte Element für ungültig erklärt kennt.
Eine Funktion, die ASP.NET Cache nicht bietet, aber dass einigen kommerziellen Lösungen ist Polling-basierten Datenbank-Synchronisierung.
Diese Funktion ist in zwei Situationen hilfreich.
Zuerst, wenn DBMS keinen .NET CLR integriert, können nicht von SqlCacheDependency profitieren Sie.
In diesem Fall wäre es schön Wenn der Cache konnte Ihrer Datenbank in konfigurierbaren Abständen Abfragen und Erkennen von Änderungen in bestimmten Zeilen einer Tabelle.
Wenn diese Zeilen geändert haben, macht Ihren Cache Ihre entsprechende zwischengespeicherte Elemente ungültig.
Die zweite Situation ist, wenn Daten in Ihrer Datenbank häufig ändern ist und .NET Ereignisse zu interaktionsintensive immer werden.
Dies geschieht, weil ein separates .NET-Ereignis ausgelöst wird für jede Änderung SqlCacheDependency und wenn Sie Tausende von Zeilen, die häufig aktualisiert werden haben, konnte dies problemlos Ihren Cache crowd.
In solchen Fällen ist es wesentlich effizienter beruhen auf Abruf, wobei können mit einer Datenbankabfrage Sie abrufen Hunderte oder Tausende von Zeilen, die geändert wurden und anschließend entsprechende zwischengespeicherte Elemente ungültig.
Natürlich Polling erstellt eine leichte Verzögerung bei der Synchronisierung (vielleicht 15–30 Sekunden), aber dies ist in vielen Fällen akzeptabel.
Read-Through
Kurz gesagt, Read-through ist eine Funktion, die den Cache Daten direkt aus der Datenquelle lesen ermöglicht unabhängig sein können.
Sie schreiben einen Read-through-Handler und registrieren Sie es mit Ihren Cache und der Cache ruft dann diesen Handler entsprechenden Zeiten.
Abbildung 4 zeigt ein Beispiel.

Abbildung 4-Beispiel für einen Ereignishandler Read-Through für SQLServer
using System.Web.Caching;
using System.Data.SqlClient;
using Company.MyDistributedCache;
...
public class SqlReadThruProvider : IReadhThruProvider
{
private SqlConnection _connection;
// Called upon startup to initialize connection
public void Start(IDictionary parameters)
{
_connection = new SqlConnection(parameters["connstring"]);
_connection.Open();
}
// Called at the end to close connection
public void Stop() { _connection.Close(); }
// Responsible for loading object from external data source
public object Load(string key, ref CacheDependency dep)
{
string sql = "SELECT * FROM Customers WHERE ";
sql += "CustomerID = @ID";
SqlCommand cmd = new SqlCommand(sql, _connection);
cmd.Parameters.Add("@ID", System.Data.SqlDbType.VarChar);
// Let's extract actual customerID from "key"
int keyFormatLen = "Customers:CustomerID:".Length;
string custId = key.Substring(keyFormatLen,
key.Length - keyFormatLen);
cmd.Parameters["@ID"].Value = custId;
// fetch the row in the table
SqlDataReader reader = cmd.ExecuteReader();
// copy data from "reader" to "cust" object
Customers cust = new Customers();
FillCustomers(reader, cust);
// specify a SqlCacheDependency for this object
dep = new SqlCacheDependency(cmd);
return cust;
}
}
Da verteilter Cache normalerweise außerhalb der Anwendung befindet, über mehrere Instanzen der Anwendung oder sogar mehrere Anwendungen freigegeben.
Eine wichtige Funktion eines Handlers Read-through ist, die Sie Zwischenspeichern, Daten vom Cache direkt aus der Datenbank abgerufen werden
Daher müssen Ihre Anwendungen Datenbankcode verfügen.
Sie können nur Daten aus dem Cache abrufen, und wenn es im Cache vorhanden ist, der Cache wechselt und dauert aus der Datenbank.
Sie erhalten sogar noch wichtiger Vorteile, wenn Sie mit Ablaufzeiten Read-through Funktionen kombinieren.
Wenn ein Element im Cache abläuft, geladen Cache automatisch durch Aufrufen des Read-through-Handlers.
Mit diesem Mechanismus, speichern Sie einen starken Datenverkehr in der Datenbank.
Der Cache verwendet nur ein Thread, eine Datenbank Reise, Daten aus der Datenbank neu laden, während Sie Tausende von Benutzern dieselben Daten zugreifen möchte möglicherweise.
Wenn Sie nicht Read-through-Funktion, würden diese Benutzer direkt an die Datenbank wird inundating der Datenbank mit Tausenden von parallelen Anforderungen werden.
Read-Through können Sie eine auf Unternehmensebene Datenraster, d. h. einen Datenspeicher, der nicht nur hoch skalierbar, sondern selbst auch von master-Datenquellen aktualisieren kann herstellen.
Dies ermöglicht Ihrer Anwendungen mit einer alternativen Datenquelle aus dem Daten gelesen und nimmt sehr viel Druck auf Ihre Datenbanken.
Wie bereits erwähnt, Datenbanken sind immer den Engpass in High-Transaktion-Umgebungen, und Sie Engpässe aufgrund hauptsächlich zu übermäßigen lesen Operationen, deren Schreibvorgänge auch verlangsamt werden.
Auftreten eines Caches, die fungiert als ein Datenblatt auf Enterprise-Ebene über Ihre Datenbank Ihre Anwendungen eine größere Leistung und Skalierbarkeit Boost bietet.
Allerdings beachten, dass Read-through ist kein Ersatz für die Durchführung einige komplexen verknüpften Abfragen in der Datenbank.
Ein typischer Cache lässt keine Sie diese Arten von Abfragen.
Eine Funktion Read-through funktioniert gut für einzelne-Objekt Lesevorgänge jedoch nicht in Operationen mit komplexe verknüpfte Abfragen, die Sie immer in der Datenbank ausführen müssen.
Durch Schreiben, hinter schreiben
Write-through ist wie Read-through: Sie einen Ereignishandler bereitstellen und der Cache Ruft den Handler die Daten in der Datenbank, schreibt Wenn Sie den Cache aktualisieren.
Ein großer Vorteil ist, dass Ihre Anwendung nicht direkt in der Datenbank zu schreiben, da der Cache für Sie durchführt.
Dies vereinfacht den Anwendungscode, weil der Cache anstelle der Anwendung der Datenzugriffscode aufweist.
Normalerweise stellt Ihre Anwendung ein Update für den Cache (z. B. hinzufügen, einfügen oder entfernen).
Der Cache aktualisiert sich selbst zuerst und gibt dann einen Update-Aufruf an die Datenbank über den Write-through-Handler.
Die Anwendung wartet, bis der Cache und der Datenbank aktualisiert werden.
Möchten was geschieht, wenn Sie warten, bis der Cache aktualisiert werden, aber Sie nicht warten für die Datenbank aktualisiert werden, da, die Leistung Ihrer Anwendung verlangsamt?
Das ist Write-Behind in Stelle kommt, die den gleichen Write-through-Handler verwendet jedoch synchron den Cache aktualisiert und der Datenbank asynchron.
Dies bedeutet, dass die Anwendung wartet, bis des Caches aktualisiert werden, aber Sie nicht warten, bis die Datenbank aktualisiert werden.
Sie wissen, dass der Datenbankaktualisierung einrichten Warteschlange und, dass die Datenbank ziemlich schnell vom Cache aktualisiert wird.
Dies ist eine andere Möglichkeit zur Leistungssteigerung Ihrer Anwendung.
Müssen Sie trotzdem auf die Datenbank schreiben, aber warum warten?
Der Cache die Daten enthält, beeinträchtigt nicht Sie selbst, wenn die Folgen von anderen Instanzen der Anwendung die Daten nicht an die Datenbank zu finden, weil Sie nur den Cache aktualisiert und die anderen Instanzen der Anwendung die Daten im Cache findet und müssen nicht zu der Datenbank zu wechseln.
Cache-Abfragen
Normalerweise sucht die Anwendung Objekte im Caches basierend auf einen Schlüssel, wie eine Hashtabelle, wie Sie in den Codebeispielen Quelle oben gesehen haben.
Sie haben den Schlüssel und der Wert ist das Objekt.
Jedoch manchmal müssen Sie nach Objekten basierend auf Attributen außer den Schlüssel zu suchen.
Daher muss der Cache der Möglichkeit für Sie zur Suche oder Abfrage im Cache bereitstellen.
Es gibt einige Möglichkeiten, die Sie dies tun können.
Eine ist auf die Attribute des Objekts suchen.
Der andere umfasst die Situationen, in der zwischengespeicherten Objekte beliebige Tags zugewiesen haben und durchsuchen möchten basierend auf der Tags.
Attribut basierende Suche steht derzeit nur in einigen kommerziellen Lösungen über Objekt Abfragesprachen, Tags basierte Suche steht jedoch in kommerziellen Caches und Microsoft-Geschwindigkeit.
Angenommen, Sie ein Customer-Objekt gespeichert haben.
Konnte sagen Sie "mir alle Debitoren geben, wobei Berlin, ist der Ort"Wenn Sie nur Kundenobjekte möchten, obwohl Ihr Cache Mitarbeiter, Kunden, Bestellungen, Bestellartikel und mehr verfügt.
Wenn Sie eine SQL-ähnliche Abfrage wie in Abbildung 5, ermittelt der Objekte, die Ihren Kriterien entsprechen.

Abbildung 5 verwenden eine LINQ-Abfrage zu Search-Objekte im Cache
using Company.MyDistributedCache;
...
public List<Customers> FindCustomersByCity(Cache cache, string city)
{
// Search cache with a LINQ query
List<Customers> custs = from cust in cache.Customers
where cust.City == city
select cust;
return custs;
}
Tags können Sie mehrere beliebige Tags eines bestimmten Objekts anfügen und das gleiche Tag kann mehrere Objekte zugeordnet werden.
Tags sind in der Regel zeichenfolgenbasierte und tagging auch können Sie Objekte in Gruppen kategorisieren und suchen Sie dann die Objekte später über diese Tags oder Gruppen.
Ereignis-Verteilung
Möglicherweise nicht immer müssen Ereignis Weitergabe im Cache, aber es ist ein wichtiges Feature, dem Sie kennen sollten.
Es ist ein gutes Feature verfügen, wenn Sie Anwendungen, HPC-Anwendungen oder mehrere Anwendungen, die Freigabe von Daten über einen Cache verteilt haben.
Welche Ereignis Verteilung wird Fragen Cache zum Auslösen von Ereignissen, wenn bestimmte Vorgänge in den Cache auftreten.
Anwendungen können diese Ereignisse erfasst und entsprechenden Aktionen als Reaktion.
Genommen Sie an, Ihre Anwendung hat ein Objekt aus dem Cache abgerufen und ist es dem Benutzer anzeigt.
Möglicherweise möchten wissen, wenn jemand aktualisiert oder dieses Objekt aus dem Cache entfernt, während er angezeigt wird.
In diesem Fall die Anwendung benachrichtigt, und Sie können die Benutzeroberfläche aktualisieren.
Dies natürlich ist ein sehr einfaches Beispiel ist.
In anderen Fällen müssen Sie möglicherweise eine verteilte Anwendung, wobei einige Instanzen der Anwendung werden Daten erzeugt und anderen Instanzen verwenden müssen.
Die Producer können die Consumer darüber informieren, wenn Daten können durch Auslösen eines Ereignisses durch den Cache, den die Consumer empfangen.
Es gibt viele Beispiele für dieses Typs, wobei Zusammenarbeit oder Daten, die Freigabe durch den Cache über Ereignis Verteilung erreicht werden kann.
Cacheleistung und Skalierbarkeit
Bei der Überlegung der Zwischenspeicherung in den vorherigen Abschnitten beschriebenen Features müssen Sie nicht vergessen, dass die Hauptassembly Du Thinking Gründe verwenden einen verteilten Cache, die Leistung zu verbessern und, wichtiger die Skalierbarkeit der Anwendung zu verbessern.
Auch, da der Cache in einer Produktionsumgebung als Server ausgeführt wird, muss Sie auch hohen Verfügbarkeit bereitstellen.
Skalierbarkeit ist das grundlegende Problem, das verteilter Cache Adressen.
Ein skalierbarer Cache ist eine Leistung verwalten können, selbst wenn Sie die Transaktion-Auslastung erhöhen.
Wenn Sie also eine XML-Webdienste Anwendung in einer Webfarm und Sie Ihre Webfarm von fünf Webservern zu 15 oder sogar 50 Webservern vergrößert, sollten können Sie proportional vergrößern die Anzahl der Cache-Server und die gleichen Antwortzeit beibehalten.
Dies wird mit einer Datenbank nicht möglich.
Ein verteilter Cache vermeidet die Skalierbarkeitsprobleme, die eine Datenbank in der Regel, ausgesetzt da es viel einfacher Natur als ein DBMS und da verschiedenen Speichermechanismen (auch bekannt als Zwischenspeicherung Topologien) als ein DBMS verwendet.
Dazu gehören repliziert, partitioniert, und Client-Cache-Topologien.
In den meisten verteilten Cache Situationen haben Sie zwei oder mehr Cache-Server als Host für den Cache.
Den Begriff "Cache-Cluster" wird verwendet werden.Formular ein logischer Cache angehören zusammen, um zwei oder mehr Cache Server anzugeben.
Ein replizierter Cache kopiert den gesamten Cache auf jedem Cacheserver im Cache-Cluster.
Dies bedeutet, dass replizierter Cache hohen Verfügbarkeit bietet.
Alle einem Cacheserver ausfällt, unterbrochen nicht Sie alle Daten im Cache, weil eine Kopie der Anwendung sofort zur Verfügung steht.
Es ist auch eine Topologie sehr effizient und bietet gute Skalierbarkeit, wenn Ihre Anwendung dazu viel lesen-Intensive Vorgänge.
Wenn Sie weitere Cache-Server hinzufügen, fügen Sie die Cache-Cluster, viel lesen Transaktion Kapazität hinzu.
Ein replizierter Cache ist jedoch nicht die ideale Topologie für Schreibintensive Operationen.
Wenn Sie den Cache so häufig aktualisieren wie Sie es lesen, verwenden Sie die replizierte Topologie an.
Ein partitionierter Cache Cache in Partitionen unterteilt und speichert eine Partition auf jedem Server Cache in den Cluster.
Diese Topologie ist die skalierbare zum Zwischenspeichern von Transaktionsdaten (Wenn Schreibvorgänge im Cache als häufig als Lesevorgänge werden).
Wenn Sie weitere Cache-Server zum Cluster hinzufügen, erhöhen Sie nicht nur die Kapazität der Transaktion, sondern auch die Speicherkapazität der Cache, da diese Partitionen zusammen den gesamten Cache bilden.
Viele verteilte Caches bieten eine Variante des ein partitionierter Cache für hohe Verfügbarkeit, wobei jede Partition auch repliziert wird, so dass der Server einen Cache eine Partition und eine Kopie oder eine Sicherung von einem anderen Server-Partition enthält.
Auf diese Weise nicht Sie alle Daten verlieren, wenn alle ein Server ausfällt.
Einige zwischenspeichernden Lösungen können Sie mehr als eine Kopie jeder Partition hinzugefügten Zuverlässigkeit zu erstellen.
Ein weiteres sehr leistungsfähige Zwischenspeichern Topologie ist Clientcache (auch aufgerufen, in der Nähe Cache), das ist sehr nützlich, wenn der Cache in einer remote dedizierten Zwischenspeichern Ebene befindet.
Die Idee hinter einem Clientcache ist, dass jeder Client ein Workingset des Caches Schließen durch (auch innerhalb der Anwendungsprozess) auf dem Clientcomputer hält.
Jedoch nur da verteilter Cache mit der Datenbank mit anderen Mitteln (wie erwähnt früher) synchronisiert werden, muss ein Clientcache mit verteilten Cache synchronisiert werden.
Einigen kommerziellen zwischenspeichernden Lösungen bieten diese Synchronisierungsmechanismus, aber die meisten bieten nur einen eigenständigen Clientcache ohne Synchronisierung.
Auf dieselbe Weise, dass ein verteilter Cache Datenverkehr in der Datenbank verringert wird verringert ein Clientcache Netzwerkverkehr zum verteilten Cache.
Es ist nicht nur schneller als der verteilte Cache da er an die Anwendung näher (und InProc kann auch sein), verbessert die Skalierbarkeit des verteilten Cache auch durch Verringern der Schleifen zum verteilten Cache.
Natürlich ist einem Clientcache ein guter Ansatz nur, wenn Sie viele mehr Lese-als Schreibvorgängen durchführen.
Wenn die Anzahl der Lese- und Schreibvorgänge gleich sind, verwenden Sie keinen Clientcache.
Schreibvorgänge werden langsamer, da Sie jetzt dem Clientcache und dem verteilte Cache aktualisieren.
Hohe Verfügbarkeit
Da verteilter Cache ausgeführt, wird wie ein Server in Ihrer Produktionsumgebung und in vielen Fällen als Datenspeicher für Ihre Anwendung nur dient (z. B. XML-Webdienste Sitzungszustand), der Cache muss hohen Verfügbarkeit bereitstellen.
Dies bedeutet, dass der Cache sehr stabil sein muss, so dass es nie stürzt ab und die Möglichkeit Konfigurationsänderungen bietet ohne Beenden des Caches.
Die meisten Benutzer eines verteilten Caches benötigen den Cache ohne alle Unterbrechungen für Monate gleichzeitig ausgeführt werden.
Wenn Sie den Cache zu beenden haben, ist es normalerweise während einer geplanten unten Zeit.
Deshalb hoher Verfügbarkeit für eine verteilte Cache so wichtig ist.
Hier finden Sie einige Fragen im Auge behalten beim Auswerten, ob eine Zwischenspeicherung Lösung hohen Verfügbarkeit bietet.
-
Können Sie einen der Server Cache Ausfall ohne Beenden des gesamten Caches?
-
Können Sie einen neuen Cacheserver ohne Anhalten des Caches hinzufügen?
-
Können Sie neue Clients ohne Unterbrechung des Caches hinzufügen?
In den meisten Caches verwenden Sie angegebene maximale Cachegröße, so dass der Cache die Menge der Daten nicht überschritten wird.
Basiert die Größe des Caches für wie viel Speicher Sie verfügbaren auf dem System verfügen.
Können Sie die Kapazität ändern?
Angenommen, Sie anfänglich die Cachegröße auf 1 GB festgelegt aber jetzt machen von 2 GB.
Können Sie das? ohne Beenden des Caches
Diese sind die Typen von Fragen zu berücksichtigen.
Wie viele diese Konfigurationsänderungen erfordern wirklich Cache neu gestartet werden?
Weniger, desto besser.
Andere als die Zwischenspeicherung Features ist die ersten Kriterien für einen Cache, der in einer Produktionsumgebung ausgeführt werden müssen wie viel der Cache soll Ihnen Betriebszeit.
Leistung
Wenn nicht den Zugriff auf den Cache schneller Zugriff auf Ihre Datenbank ist, besteht keine Notwendigkeit, damit einfach put.
Müssen andererseits, sollten hinsichtlich der Leistung von eine gute verteilte Cache Erwartungen?
Als Erstes zu merken ist ein verteilter Cache normalerweise OutProc oder Remote, damit Zugriffszeit noch nie so schnell wie von einer eigenständigen InProc-Cache (z. B. ASP.NET Cache).
In einem eigenständigen InProc-Cache können Sie wahrscheinlich 150.000 zu 200.000 Elemente pro Sekunde (1 KB Objektgröße) lesen.
Mit einer OutProc oder einen remote-Cache löscht dieser Zahl erheblich.
Hinsichtlich der Leistung sollten Sie über 20.000 zu 30.000 Lesevorgänge pro Sekunde (1 KB Objektgröße) als den Durchsatz eines einzelnen Cache-Servers (von allen Clients auf davon) erwarten.
Sie können einige dieser InProc-Leistung erzielen, indem mit einem Clientcache (im InProc-Modus), aber das ist nur für Lesevorgänge und nicht für Schreiboperationen.
Sie einige Leistung opfern, um Skalierbarkeit zu erhalten, aber langsamere Leistung ist immer noch viel schneller als Datenbankzugriff.
Verschafft Häufigkeit
Ein verteilter Cache als ein Konzept und als bewährte Methode ist Weitere beliebter.
Vor, nur ein paar Jahren wusste sehr wenige Personen in der .NET Speicherplatz darüber, obwohl die Java-Gemeinde vor von .NET in diesem Bereich wurde.
Mit dem Zündkapsel Wachstum Transaktionen der Anwendung Datenbanken sind Ihre Grenzen Produktionsbelastung und verteilte Zwischenspeicherung wird jetzt ein notwendiger Bestandteil jeder skalierbare Anwendungsarchitektur akzeptiert.
Iqbal Khan ist Präsident und Technologie Evangelist Alachisoft.
Alachisoft bietet NCache, eine branchenführende .NET Cache für die Steigerung von Leistung und Skalierbarkeit in Unternehmensanwendungen verteilt.
Iqbal hat eine MS in Informatik von Indiana University Bloomington.
Sie erreichen ihn unter iqbal@alachisoft.com.