Freigeben über


Parallelitätsmodelle (AppFabric 1.1-Cache)

Die Architektur von Microsoft AppFabric 1.1 für Windows Server gestattet jedem Cacheclient den freien Zugriff auf zwischengespeicherte Daten, wenn diese Clients über die geeigneten Netzwerkzugriffs- und Konfigurationseinstellungen verfügen. Die stellt für die Sicherheit ebenso wie für den parallelen Zugriff eine Herausforderung dar.

Zur Verringerung der Sicherheitsrisiken sollten alle Cacheclients, Cacheserver und primären Datenquellenserver Mitglieder der gleichen Domäne sein und im Umkreisnetzwerk einer Firewall bereitgestellt werden. Darüber hinaus wird dringend empfohlen, die Anwendungskonfigurationsdateien auf den Cacheclients zu sichern.

Zur Unterstützung Ihrer Anwendung beim Umgang mit Problemen mit dem parallelen Zugriff unterstützt AppFabric optimistische und pessimistischen Parallelitätsmodelle. Weitere Informationen zu den Methoden, die für die Abstimmung auf diese Modelle zur Verfügung stehen, finden Sie unter Parallelitätsmethoden.

Optimistisches Parallelitätsmodell

Im optimistischen Parallelitätsmodell werden für Aktualisierungen zwischengespeicherter Objekte keine Sperren verwendet. Stattdessen erhält und speichert der Cacheclient auch die aktuelle Version eines Objekts, wenn er ein Objekt aus dem Cache abruft. Wenn eine Aktualisierung erforderlich wird, sendet der Cacheclient den neuen Wert für das Objekt zusammen mit der gespeicherten Version des Objekts. Das System aktualisiert das Objekt nur dann, wenn die gesendete Version mit der aktuellen Version des Objekts im Cache übereinstimmt. Mit jeder Aktualisierung eines Objekts wird dessen Versionsnummer geändert, wodurch verhindert wird, dass mit einer Aktualisierung die Änderungen eines anderen Cacheclients überschrieben werden.

Das Beispiel in diesem Thema zeigt, wie bei der optimistischen Parallelität die Datenkonsistenz sichergestellt wird.

Beispiel

In diesem Beispiel versuchen zwei Cacheclients (cacheClientA und cacheClientB) auf zwei unterschiedlichen Anwendungsservern, das gleiche zwischengespeicherte Objekt mit Namen RadioInventory zu aktualisieren.

Zeitpunkt Null: Beide Clients rufen dasselbe Objekt ab

Zum Zeitpunkt Null (T0) instanziieren beide Cacheclients eine DataCacheItem-Klasse, um das zwischengespeicherte Objekt zu erfassen, das sie aktualisieren wollen, zusammen mit zusätzlichen Informationen zum zwischengespeicherten Objekt wie Versions- und Taginformationen. Dies wird mit dem folgenden Diagramm und Codebeispiel illustriert.

Parallelitätsmodell von „Velocity“ bei T0

'cacheClientA pulls the FM radio inventory from cache
Dim clientACacheFactory As DataCacheFactory = New DataCacheFactory()
Dim cacheClientA As DataCache = _
        clientACacheFactory.GetCache("catalog")
Dim radioInventoryA As DataCacheItem = _
        cacheClientA.GetCacheItem("RadioInventory", "electronics")

'cacheClientB pulls the same FM radio inventory from cache
Dim clientBCacheFactory As DataCacheFactory = New DataCacheFactory()
Dim cacheClientB As DataCache = _
       clientBCacheFactory.GetCache("catalog")
Dim radioInventoryB As DataCacheItem = _
        cacheClientA.GetCacheItem("RadioInventory", "electronics")
//cacheClientA pulls the FM radio inventory from cache
DataCacheFactory clientACacheFactory = new DataCacheFactory();
DataCache cacheClientA = clientACacheFactory.GetCache("catalog");
DataCacheItem radioInventoryA = 
    cacheClientA.GetCacheItem("RadioInventory","electronics");

//cacheClientB pulls the same FM radio inventory from cache
DataCacheFactory clientBCacheFactory = new DataCacheFactory();
DataCache cacheClientB = clientBCacheFactory.GetCache("catalog");
DataCacheItem radioInventoryB= 
    cacheClientA.GetCacheItem("RadioInventory", "electronics");

Hinweis

Obwohl in diesem Beispiel die Versionsinformationen mit der GetCacheItem-Methode abgerufen werden, um das DataCacheItem-Objekt zu erhalten, ist es auch möglich, die Get-Methode zu verwenden, um das DataCacheItemVersion-Objekt zu erhalten, das dem abgerufenen Cacheelement zugeordnet ist.

Zeitpunkt Eins: Erste Aktualisierung erfolgreich

Zum Zeitpunkt Eins (T1) aktualisiert cacheClientA das zwischengespeicherte Objekt RadioInventory mit einem neuen Wert. Wenn cacheClientA die Put-Methode ausführt, wird die dem RadioInventory-Cache zugeordnete Version erhöht. Zu diesem Zeitpunkt verfügt cacheClientB über ein veraltetes Cacheelement. Dies wird mit dem folgenden Diagramm und Codebeispiel illustriert.

Parallelitätsmodell von „Velocity“ bei T1

'at time T1, cacheClientA updates the FM radio inventory
Dim newRadioInventoryA As Integer = 155

cacheClientA.Put("RadioInventory", newRadioInventoryA, _
                 radioInventoryA.Version, "electronics")
//at time T1, cacheClientA updates the FM radio inventory
int newRadioInventoryA = 155;

cacheClientA.Put("RadioInventory", newRadioInventoryA, 
    radioInventoryA.Version,"electronics");

Zeitpunkt Zwei: Die zweite Aktualisierung schlägt fehl

Zum Zeitpunkt Zwei (T2) versucht cacheClientB, das zwischengespeicherte RadioInventory-Objekt zu aktualisieren, indem die nun veraltete Versionsnummer verwendet wird. Um zu verhindern, dass die Änderungen von cacheClientA überschrieben werden, schlägt der Aufruf der Put-Methode durch cacheClientB fehl. Der Cacheclient gibt ein DataCacheException-Objekt aus, bei dem die ErrorCode-Eigenschaft auf CacheItemVersionMismatch festgelegt ist. Dies wird mit dem folgenden Diagramm und Codebeispiel illustriert.

Parallelitätsmodell von „Velocity“ bei T2

'later, at time T2, cacheClientB tries to 
'update the FM radio inventory, throws DataCacheException with
'an error code equal to DataCacheErrorCode.CacheItemVersionMismatch.
Dim newRadioInventoryB As Integer = 130

cacheClientB.Put("RadioInventory", newRadioInventoryB, _
                 radioInventoryB.Version, "electronics")
//later, at time T2, cacheClientB tries to 
//update the FM radio inventory, throws DataCacheException with
//an error code equal to DataCacheErrorCode.CacheItemVersionMismatch.
int newRadioInventoryB = 130;

cacheClientB.Put("RadioInventory", newRadioInventoryB,
    radioInventoryB.Version,"electronics");

Pessimistisches Parallelitätsmodell

Im pessimistischen Parallelitätsmodell sperrt der Client Objekte ausdrücklich, um Vorgänge auszuführen. Andere Vorgänge, die Sperren anfordern, werden zurückgewiesen (das System blockiert Anforderungen nicht), bis die Sperren freigegeben wurden. Wenn Objekte gesperrt sind, wird ein Sperrhandle als ein Ausgabeparameter zurückgegeben. Das Sperrhandle ist zum Aufheben der Sperre des Objekts erforderlich. Falls die Clientanwendung vor der Freigabe eines gesperrten Objekts beendet wird, werden Timeouts bereitgestellt, um die Sperren freizugeben. Gesperrte Objekte laufen niemals ab, sie können jedoch nach dem Aufheben ihrer Sperre sofort ablaufen, wenn ihre Ablaufzeit überschritten wurde. Weitere Informationen zu den Methoden, die in Verbindung mit dem pessimistischen Parallelitätsmodell verwendet werden, finden Sie unter Parallelitätsmethoden.

Hinweis

Vorgangsübergreifende Transaktionen werden nicht unterstützt. Die Anwendung, die den Cache verwendet, ist für die Ermittlung der Reihenfolge der Sperren und ggf. das Erkennen von Deadlocks verantwortlich.

Warnung

Gesperrte Objekte im Cache können dennoch durch beliebige Cacheclients mit der Methode Put ersetzt werden. Cacheaktivierte Anwendungen sind für die konsistente Verwendung von PutAndUnlock für Elemente verantwortlich, die das pessimistische Parallelitätsmodell verwenden.

Siehe auch

Konzepte

Parallelitätsmethoden
Diagramm der physischen Windows Server AppFabric-Cachearchitektur (AppFabric 1.1-Cache)
Diagramm der logischen Windows Server AppFabric-Cachearchitektur (AppFabric 1.1-Cache)
Entwickeln eines Cacheclients

  2012-03-05