Freigeben über


Dieser Artikel wurde maschinell übersetzt.

Toolbox

Zwischenspeichern, Object-Objekt zuordnen, Blogs und mehr

Scott Mitchell

Verbessern der Leistung von Webanwendungen mit verteilter Zwischenspeicherung

Für die meisten datengesteuerten Webanwendungen zeigt jede Seite eine Vielzahl von Informationen aus der Datenbank. Beispielsweise wird eine typische Webseite bei Amazon.com zeigt Details über ein Produkt und enthält Benutzer Überprüfungen, verwandte Produkte, Informationen zu den Käufer und usw.. Bei jeder Anforderung eine Seite muss die Anwendung daher eine Cascade Abfragen in der Datenbank zum Abrufen des Informationen auf der Seite angezeigt ausgeben. Dieser "weitschweifender"Verhalten für Webanwendungen mit hellen Datenverkehr funktioniert, aber es ist nicht gut skalierbar.

Zwischenspeichern ist die am effektivsten Tools zum Reduzieren der Auslastung und Verbessern der Skalierbarkeit in lesen dominiert, datengesteuerte Webanwendungen. ASP.NET enthält eine integrierte Zwischenspeichern-API, die eine speicherinterne Sicherungsspeicher verwendet und Features wie Expiries zeitbasierte und Dateiabhängigkeiten System- und Datenbank. Es gibt auch den Caching Application Block in der Enterprise Library außerhalb von ASP.NET Anwendungen und bietet größere Flexibilität hinsichtlich der wie und wo die Cachedaten gespeichert ist verwendet werden kann. Sowohl der Caching Application Block als auch im ASP.NET-Cache werden jedoch die Cachedaten lokal speichern. Dies führt zu nicht optimalen Leistung in einer Webfarmumgebung, da ein Server zwischengespeicherten Daten nicht mit anderen Servern in der Farm zugegriffen werden können. Eine Möglichkeit ist einen einzelnen Server in der Farm als zentrale Cacheserver festlegen, ist es die einzige Kopie im Cache speichern, und tauschen Sie es u. a. die. Dieser Ansatz führt jedoch ein Einzelpunkt-Fehler und einen potenziellen Engpass.

Verteilte Zwischenspeicherung überwindet Mängel müssen mehrere lokalisierte Caches oder auf einem einzelnen zurückzugreifen Zentralisierte Cachespeicher. Kurz gesagt, ein verteilter Cache repliziert oder Partitionen von den Cachespeicher auf mehreren Servern eine effizientere Zwischenspeichern Strategie in einer Webfarmumgebung ermöglicht.

Eine Vielzahl von verteilte Zwischenspeicherung Tools sind verfügbar. Eines der beliebtesten ist Memcached (Version 1.2.8), eine kostenlose, Open-Source-Option für Danga interaktiv erstellt und auf Websites wie LiveJournal, Wikipedia und SourceForge High-Profil verwendet. Memcached hat seinen Stämme in den Stapel LAMP (Linux, Apache, MySQL, PHP), aber es sind Ports der Community erstellt Windows und .NET Bibliotheken verfügbar sind, zusammen mit benutzerdefinierten Open-Source-Anbieterklassen für die Integration mit ASP.NET Sitzungszustand. Microsoft ist ausgelastet arbeiten eigene verteilte Zwischenspeicherung Bibliothek mit dem Codenamen "Geschwindigkeit"die zum Zeitpunkt des Verfassens dieses Artikels als eine Community Technology Preview verfügbar ist. Und es gibt auch kommerzielle verteilte Zwischenspeicherung Tools wie ScaleOut StateServerScaleOut SessionServer von ScaleOut Software und NCache von Alachisoft. (NCache wurde in der Ausgabe Oktober 2007 überprüft: msdn.microsoft.com/magazine/cc163343.aspx.)

Eine Schnellanleitung für jedes verteilte Zwischenspeicherung Tool müssen Sie zunächst den verteilten Cache Topologie definieren. Mit Memcached starten Sie einfach die Memcached-Dienst oder Anwendung auf diesen Computern, in denen Cachedaten gespeichert werden Parameter wie die Cachegröße über Befehlszeilenoptionen angeben. Geschwindigkeit und die meisten kommerziellen Angebote Moreprovide Befehlszeilen Zugriff und grafischen Benutzeroberflächen zum Erstellen und Verwalten der Topologie.

Die Muster zum Lesen und Schreiben in der verteilten Cache unterscheiden sich nicht von den verwendeten mit ASP.NET integrierten caching-API. Beide Typen von Caches fungieren als eine riesige Hashtabelle, von dem jedes Element im Cache durch eine eindeutige Zeichenfolge verwiesen wird. Der Pseudocode in Abbildung 1 zeigt, wie Daten aus dem Cache gelesen werden. Wenn die "Get"Anweisung wird ausgeführt, verteilte Cache Bibliothek bestimmt, wo das zwischengespeicherte Element ist in der Topologie vorhanden und werden die Daten abgerufen. Beachten Sie, die die Client-Anwendung ausgehen kann nicht, dass die Daten im Cache, vorhanden da er möglicherweise abgelaufen, wurde durch Benutzercode oder aufgrund einer Abhängigkeit entfernt, oder aufgrund von Speicherbeschränkungen entfernt wurde. Stattdessen muss die Clientanwendung immer überprüfen, ob Daten aus dem Cache zurückgegeben wurden. Wenn das Element nicht gefunden wird, muss dann werden re-retrieved und dem Cache erneut hinzugefügt.

Abbildung 1 Standard "Get" anfordern

Function GetUserProfile(UserID)
UserProfile = Cache.Get(
“UserProfile" + UserID)
If UserProfile = NULL Then
UserProfile = _
Database.GetUserProfile(UserID)
Cache.Add("UserProfile" +
UserID, UserProfile)
End If
Return UserProfile
End Function

Sobald Daten aktualisiert werden, werden alle Verweise auf die Daten im Cache veraltet. Um zu verhindern veraltete Daten angezeigt, müssen alle zwischengespeicherten Verweise entfernt oder aktualisiert werden. Abbildung 2 enthält Pseudocode, die ausgeführt würde, wenn ein Benutzer der Website Ihr Profil aktualisiert. Diese Methode nicht nur die Datenbank für jede Instanz aktualisiert aber auch das Element im zugehörigen Cache mit den neuen Daten aktualisiert. Andere Techniken für die Wartung aktuelle Daten im Cache zählen Expiries und Cacheabhängigkeiten.

Abbildung 2 Standard "Aktualisieren" anfordern

Function UpdateUserProfile(UserProfile)
Database.UpdateserProfile(UserProfile)
Cache.Update("UserProfile" +
UserProfile.UserID, UserProfile)
End Function

Zwischenspeicherung ist eine wichtige Komponente bei der Erstellung einer Webanwendung skalierbaren, datengesteuerte. Großen, stark trafficked Websites, die eine Webfarm verwenden, sollten Sie verwenden einen verteilten Cache um die Leistung zu maximieren. Tools wie Memcached, Geschwindigkeit und andere bieten eine leicht zu bedienende-API für das Arbeiten mit dem Cache und kapseln Details auf niedriger Ebene der Wartung, aktualisieren und den Zugriff auf verteilten Cache.

Memcached:

danga.com/memcached

Geschwindigkeit:

MSDN.Microsoft.com/Data/cc655792.aspx

Wichtige Blogs

Die meisten der technischen Blogs Fokus auf die Technologien täglich abonnierte, einschließlich ASP.NET AJAX-Verwendung entwerfen und so weiter. Aber ich auch einen Punkt suchen und Lesen Blogs von Experten in anderen Feldern vornehmen. Für mich kann ein Experte ist eine Person mit eine Fülle von Informationen und, wichtiger, reale Erfahrung und diese Weisheit derart deaktivieren und Meaningful―even für Entwickler, die nicht in der Technologie well-versed sind.


Udi Dahan ’s Blog: udidahan.com/?blog=true

Udi Dahan passt diese Beschreibung. Dahan ist ein Sprecher, Schulungsleiter und Berater zur Softwarearchitektur und Entwurf von verteilten Systemen und zahlreiche umfangreiche, dienstorientierte Anwendungen für Unternehmen gearbeitet hat. Er nutzt seine Einblicke in seinem Blog auf Onlineressource Websites und im MSDN Magazine (siehe msdn.microsoft.com/magazine/dd569749.aspx und msdn.microsoft.com/magazine/cc663023.aspx).

Wenn Sie Dahan's Blog vor noch nicht besucht, beginnen Sie mit der "erste Zeit hier?" Seite (udidahan.com/first-time-here), wobei Sie seine beliebtesten Artikel Blogbeiträge, Interviews und Webcasts für dienstorientierte Architektur (SOA), Domänenmodelle und smart Client-Anwendungen finden. Checken Sie auch im Abschnitt für Artikel, udidahan.com/articles, Verknüpfungen zu Dahan des veröffentlichten Inhalte enthält. Und wenn Sie eine SOA implementieren möchten, checken Sie nServiceBus des Dahan kostenlose, Open Source-messaging-Framework für .NET-Anwendungen.

nServiceBus:

nservicebus.com

Udi Dahan ’s Blog:

UdiDahan.com/?Blog=true

Eine hilfreiche Dienstprogramm zum Objekt-Object-Zuordnung

Eine objektorientierte Anwendungsarchitektur Modelle die Domäne realen Problem durch die Verwendung von Objekten und über objektorientierte Prinzipien wie Vererbung, Modularität und Kapselung. Eine POS-Anwendung müsste Klassen wie Mitarbeiter, Kunden, OrderItem und Produkte. Abbildung 3 zeigt, wie diese Klassen bestehen möglicherweise einem Verkauf zu modellieren.

Abbildung 3 Teile des Verkaufs Objekt

public class Sale {
public Employee SalesPerson { get; set; }
public Customer Customer { get; set; }
public IEnumerable<OrderItem> Items {
get; set; }
}
public class OrderItem {
public Product Product { get; set; }
public int Quantity { get; set; }
public decimal Discount { get; set; }
}

Obwohl dieses Modell auch innerhalb der Anwendungsdomäne funktioniert, kann es einem weniger als idealen Modell zum Verschieben von Daten außerhalb der Domäne sein. Genommen Sie an, dass unsere Anwendung eine Windows Communication Foundation (WCF)-Dienst enthalten, die Verkaufsdaten an einem Geschäftspartner offen gelegt. Während der Dienst eine Auflistung der Verkauf Objekte zurückgeben konnte, können diese Objekte, enthalten mehr Daten als wir um verfügbar zu machen. Die Mitarbeiter-Objekt oder die Customer-Objekt im Verkauf-Objekt möglicherweise vertraulichen Informationen, wie z. B. Sozialversicherungsnummern oder Zahlungsdetails enthalten. Die Produkte, die die OrderItems umfassen möglicherweise unwichtige Informationen enthalten, die die Größe der übertragenen Nutzlast unnötig vergrößert werden soll.

Ein gebräuchliches Verfahren für diese Bereitstellungsproblemen besteht darin, Data-Objekte übertragen (DTOs) definieren z. B. SalesDTO, EmployeeDTO, CustomerDTO und so weiter. Diese DTOs enthält den genauen Satz von Eigenschaften gemeinsam nutzen. Der Code für den Dienst mit der Domäne Models―Sale Mitarbeiter intern funktioniert und so Forth―but vor der Rückgabe der Daten würde entsprechende DTOs erstellen und füllen Sie mit der entsprechenden Eigenschaften aus den Domänenobjekten.

Das Domänenobjekt DTO schreiben ist Zuordnung Code mühsam. Wenn Sie regelmäßig schreiben solcher Code-Objekt-Zuordnung gefunden haben, checken Sie Version 0.3.1 AutoMapper. AutoMapper ist ein kostenloses, Open-Source-Dienstprogramm, die ein Objekt auf einen anderen mit so wenig wie zwei Codezeilen automatisch zugeordnet werden können.

Typen wie starten, rufen Sie die Mapper.CreateMap-Methode und geben Sie die Quelle und Ziel: Mapper.CreateMap*<SourceType, DestinationType>*(). Dies erstellt ein MappingExpression-Objekt, das die Zuordnung zwischen zwei Objekttypen definiert. Wenn es sind geschachtelte Typen (wie es im Abbildung 3), Sie würden CreateMap einmal aufrufen, für jeden Typ, der zugeordnet werden muss.

Nachdem Sie die Zuordnung erstellt haben, rufen Sie Mapper.Map und übergeben Sie das Quellobjekt: Mapper.Map*<SourceType, DestinationType>*(sourceObject). Die Map-Methode gibt eine Instanz des Zielobjekts zurück, mit den Eigenschaften der entsprechenden Membern in der Quelle zugewiesen.

Die Abbildungen 4 und 5 veranschaulichen ein End-to-End-Beispiel. Abbildung 4 werden die beiden Objekte in diesem Beispiel definiert: Produkt und ProductDTO. Abbildung 5 zeigt Code aus unserer WCF-Dienst. Hier haben wir ein Produkt Objekt, das wir auf ein ProductDTO-Objekt, das an den Client zurückgegeben zuordnen müssen. Beachten Sie, wie diese Zuordnung von des AutoMapper-Mapper-Klasse mit nur zwei Codezeilen ausgeführt wird.

Abbildung 5 AutoMapper Mapper.Map-Methode erstellt ein neues ProductDTO-Objekt basierend auf den angegebenen Product

public ProductDTO GetProduct(Guid productId) {
Product product = Product.Load(productId);
// Map Product onto a ProductDTO object
Mapper.CreateMap<Product, ProductDTO>();
ProductDTO productDto =
Mapper.Map<Product, ProductDTO>(product);
return productDto;
}

AutoMapper kann auch zwischen Sammlungen eines Typs zu einer anderen, wie z. B. eine Liste der Produkt-Objekten in ein Array von ProductDTO Objekte Zuordnung zuordnen.

In der Praxis ist es nicht immer möglich, die Eigenschaftennamen oder Eigenschaft Typen ordentlich Zeile oben zwischen Quelle und Ziel-Objekttypen, aber das ist kein Problem für AutoMapper. Mit einer Zeile des Codes können Sie eine Eigenschaft (oder Eigenschaften) des Quelltyps anders benannte Eigenschaft in den Zieltyp Projekt. Wenn zugeordneten Eigenschaftentypen nicht ausgerichtet werden, kann AutoMapper automatisch konvertieren die Herkunftsart-Eigenschaft in den Zieltyp-Eigenschaft Wenn in .NET Framework ein geeigneten Typkonverter vorhanden ist. Wenn keine solche Typkonverter vorhanden ist, können Sie einen benutzerdefinierten Typkonverter erstellen.

Preis: Kostenlos, open source

CodePlex.com/AutoMapper

Scott Mitchell , Autor zahlreicher Bücher und Gründer von 4GuysFromRolla.com, arbeitet ein MVP seit 1998 mit Microsoft-Webtechnologien. Mitchell ist unabhängiger Berater, Schulungsleiter und Schriftsteller. Sie erreichen ihn unter Mitchell@4guysfromrolla.com oder über seinen Blog unter ScottOnWriting.net.