並行存取模型 (Windows Server AppFabric 快取)
Windows Server AppFabric 架構讓具有適當的網路存取權與組態設定的任何快取用戶端,可以公開存取任何已快取的資料。這對安全性和並行存取而言都是一項挑戰。
為減少安全性風險,所有快取用戶端、快取伺服器與主要的資料來源伺服器都應為相同網域的成員,且應部署在防火牆內。我們也強烈建議您使用適當的機制來保護快取用戶端上應用程式組態檔的安全。
為協助您的應用程式處理並行存取問題,AppFabric 支援開放式與封閉式並行存取模型。如需有關與這些模型一起使用之方法的詳細資訊,請參閱並行存取方式 (Windows Server AppFabric 快取)。
開放式並行存取模型
在開放式並行存取模型中,對於快取物件的更新並不會取得鎖定。相反地,當快取用戶端從快取取得物件時,它也會取得並儲存該物件的最新版本。當需要更新時,快取用戶端會傳送物件的新值與已儲存版本物件。只有當傳送的版本與快取中物件的最新版本相符時,系統才會更新物件。每次物件更新時都會變更它的版本號碼,這樣可防止更新程序覆寫其他人所做的變更。
本主題的範例說明開放式並行存取如何維持資料一致性。
範例
在此範例中,兩部不同的應用程式伺服器上的兩個快取用戶端 (cacheClientA
與 cacheClientB
) 嘗試更新名為 RadioInventory
的快取物件。
時間 0:兩個用戶端會擷取相同的物件
在時間 0 (T0) 時,這兩個快取用戶端會具現化 DataCacheItem 類別,以擷取它們要更新的快取物件和與該快取物件關聯的其他資訊 (例如,版本和標記資訊)。下列圖形與程式碼範例說明此情況。
'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");
注意
雖然此範例透過使用 GetCacheItem 方法擷取 DataCacheItem 物件以取得版本資訊,您也可以使用 Get 方法取得與已擷取之快取項目關聯的 DataCacheItemVersion 物件。
時間 1:第一次更新成功
在時間 1 (T1),cacheClientA
會以新值更新快取物件 RadioInventory
。當 cacheClientA
執行 Put 方法時,與 RadioInventory
快取項目關聯的版本會遞增。此時,cacheClientB
擁有過時的快取項目。下列圖形與程式碼範例說明此情況。
'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");
時間 2:第二次更新失敗
在時間 2 (T2),cacheClientB
嘗試使用目前已過時的版本號碼來更新 RadioInventory
快取的物件。為防止覆寫 cacheClientA
所做的變更,cacheClientB
Put 方法呼叫會失敗。快取用戶端會擲回 DataCacheException 物件,且 ErrorCode 屬性會設定為 CacheItemVersionMismatch。下列圖形與程式碼範例說明此情況。
'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");
封閉式並行存取模型
在封閉式並行存取模型中,用戶端會明確地鎖定物件以執行操作。要求鎖定的其他操作會被拒絕 (系統不會封鎖要求),直到鎖定被釋放。當物件被鎖定時,會傳回鎖定控制控制代碼做為輸出參數。必須有鎖定控制代碼才能將物件解除鎖定。為避免用戶端應用程式在釋放已鎖定的物件之前結束,我們提供根據逾時來釋放鎖定的機制。已鎖定的物件一律不會到期,但當那些物件在已經過到期時間的情況下被解除鎖定時,它們會立即到期。如需有關與封閉式並行存取模型一起使用之方法的詳細資訊,請參閱並行存取方式 (Windows Server AppFabric 快取)。
注意
不支援跨操作的交易。使用快取的應用程式負責決定鎖定順序並偵測鎖死 (如果有的話)。
警告
任何用戶端都可以使用 Put 方法來取代快取中的已鎖定物件。已啟用快取功能的應用程式必須一律針對使用封閉式並行存取模型的項目使用 PutAndUnlock。
另請參閱
概念
並行存取方式 (Windows Server AppFabric 快取)
Windows Server AppFabric 快取功能實體架構圖
Windows Server AppFabric 快取功能邏輯架構圖
開發快取用戶端 (Windows Server AppFabric 快取)
2011-12-05