微軟分布式緩衝AppFabric(Velocity)學習-緩衝概念(二)

來源:互聯網
上載者:User

接上一篇 學習中,順便翻譯,有不正確的地方歡迎指正,轉載請註明出處http://cnblogs.com/xuf22

二、緩衝概念

2. 快取用戶端與本機快取

使用Velocity緩衝,應用程式中需要用到DataCacheObject Storage Service緩衝對象。這個對象就是快取用戶端,它為應用程式提供了一個快取叢集服務的name cache的引用。該對象由DataCacheFacory對象的GetCache方法建立。

出於效能考慮,建議在應用程式中盡量少建立DataCacheFactory對象,在應用程式中建立一個全域變數,以便快取用戶端可以在任何地方都給使用--用單件模式吧

快取用戶端分為兩種:路由用戶端和普通用戶端。兩種快取用戶端都可以將緩衝儲存在本地,這種被儲存在本地的緩衝稱為:本機快取。快取用戶端的儲存選項可以通過應用程式設定檔指定。

2.1 安全考慮

快取用戶端應該用在運行資料中心的伺服器上的應用程式中,在企業防火牆內。快取服務和緩衝主機之前的通訊是不加密的,很容易受到“嗅探”和“Replay”攻擊。

強烈建議使用加密的XML設定檔來指定快取用戶端。

2.2 用戶端類型

中有兩個使用了緩衝的應用程式:路由(routing)和普通的(simple)

路由用戶端(Routing Client)

Routing Client的效能要高於Simple Client,因為它在緩衝的引導主機(Lead hots)上儲存了一張路由表。該路由表用記錄快取叢集中的所有緩衝主機上的對象的地址並做唯一標示。Routing Client使用路由表可以直接找到對象的物理地址。

普通用戶端(Simple Client)

只要有可能,盡量使用Routing Client,但在情況下,如網路拓撲中,可能有些用戶端只能訪問快取服務群集的中的部分主機,這時就要用到Simple Cleint來做為分布式緩衝的資料來源。

為了在有限的網路通訊情況下工作,Simple Client被設計為只訪問快取叢集中的一台主機。它沒有路由選擇功能,不能跟蹤對象的地,要擷取緩衝中的一個對象通常需要遍曆所有主機。

本機快取Local Cache

緩衝主機儲存的是序列化後的對象,用戶端要使用該對象,必需先還原序列化,為了提高取出對象的效率,可以啟用本機快取。路由用戶端和普通用戶端都可以使用本機快取。

當啟用本機快取後,對象將以複本的文本保本機電腦的內在中,用戶端應用程式在從緩衝主機取出對象時,先檢查本機快取是否已存在該對象。如果本機快取已存在該對象,將直接從本地取出。

本機快取有兩種到期策略:逾時到期和通知到期。

線程並發(Object Consistency)

本機快取對象和快取用戶端對象在同一個進程空間中,只為DataCache是引用方式擷取這些對象,在多線程應用程式中可能會存線上程同步問題。

為了避免潛在的多線程中的問題,多線程應用程式在使用緩衝對象時應先產生一個對象的複本,或對取其它方式來避免線程並發問題。另一種方法是為每一個線程建立一個DataCache對象。

3 並發概念

Velocity允許任何有網路許可權和相關配置的快取用戶端公開的訪問快取資料,這樣就面臨著安全和並發的挑戰。

為了減少安全問題,所有的快取用戶端、快取服務和主要資料原始伺服器都應該在同一個域下,並在防火牆內,這是極度推薦的方法。

為瞭解決並發問題,Velocity提供了開放式並發和保守式並發。

3.1 開放式併發模式(Optimistic Concurrency Model)

在開放式並發下,對象不會在更新時被鎖定,訪問緩衝時先讀取緩衝對象,更新時再對緩衝版本進行檢查,如果本機快取對象已到期,則緩衝更新失敗。

例如:兩個快取用戶端(cacheClientA and cacheClientB)在兩個獨立的應用程式中都要更新同一個名為RadioInventory的緩衝。

Time Zero(T0):兩個對象同時取出同一個對象

兩個快取用戶端實各例化一個DataCacheItem類,並取出緩衝同一個對象,兩個DataCacheItem執行個體要準備要更新對象。

T0:取出對象//cacheClientA pulls the FM radio inventory from cacheDataCacheFactory clientACacheFactory = new DataCacheFactory();DataCache cacheClientA = clientACacheFactory.GetCache("catalog");DataCacheItem radioInventoryA =     cacheClientA.GetCacheItem("RadioInventory","electronics");//cacheClientB pulls the same FM radio inventory from cacheDataCacheFactory clientBCacheFactory = new DataCacheFactory();DataCache cacheClientB = clientBCacheFactory.GetCache("catalog");DataCacheItem radioInventoryB=     cacheClientA.GetCacheItem("RadioInventory", "electronics");

Time One(T1): cacheClientA更新對象成功

cacheClientA將對象RadioInventory更新,RadioInventory的版本號碼添加,這時cacheClientB中的RadioInventory對象已到期。

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

Time Two: The Second Update Fails

cacheClientB嘗試修改RadioInventory為一個新值,為了阻止將cacheClientA的更新覆蓋,cacheClientB的更新將會失敗。

//later, at time T2, cacheClientB tries to //update the FM radio inventory, triggers exception ERRCA001int newRadioInventoryB = 130;cacheClientB.Put("RadioInventory", newRadioInventoryB,    radioInventoryB.Version,"electronics");

保守式並發

當用戶端取出對象時明確指出該對象已被取出,正在更新,所有對緩衝對象的請求都被駁回,直到銷被釋放。當緩衝對象被鎖定時,讀取操作會返回一個控制代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.