雲端計算設計模式(一)Cache Aside模式

雲端計算設計模式(一)Cache Aside模式

按照需要將資料從資料儲存中載入到快取中。這將提高訪問資料的效能,也會幫助提高儲存在快取中的資料和資料儲存中資料的一致性。

上下文和問題

應用使用快取來提升重複訪問儲存在資料儲存中資料的效能。然而,希望快取中的資料和資料儲存中的資料總是保持一致,是不現實的。因此,應用需要實現一種策略來保證快取中的資料儘可能新,同時也可以探測和處理快取資料過期的情況。

解決方案

很多的商業快取系統可以提供透讀(read-through),透寫(write-through)和後臺寫(write-behind)的操作,在這些系統中,應用通過訪問快取抽取資料,系統將從資料儲存中載入資料並新增到快取中;任何對快取中資料的修改,都將自動寫回到資料儲存中。

如果快取不提供這些功能,那麼,維護資料的一致性,就是使用快取資料的應用程式的職責。

應用程式可以通過實現實現read-aside策略,來模仿read-through的功能,這個策略在需要的時候,載入資料到快取中,下面的圖示列舉了如何使用Cache-Aside模式在快取中儲存資料。

如果應用更新了資訊,可以遵循Write-through策略,更新資料儲存中的資料,並將快取中相應的資料項失效。

當這個資料項下次被訪問的時候,使用Cache-aside模式,將導致更新後的資料被從資料儲存中抽取出來,重新新增到快取中。

問題和思考

當你決定使用Cache-aside模式時,需要考慮以下幾點:

1)快取資料的生命週期

很多快取實現了過期策略,當快取中的資料在一個指定的時間內沒有被訪問,快取伺服器會將資料失效,並將其從換出中移除。為了保證Cache-aside是有效的,就需要確保過期策略與應用程式使用的資料的訪問模式想匹配。不要讓快取的過期時間太短,因為這將導致應用不斷的從資料儲存載入資料,並新增到快取中。同樣的,不要讓過期時間太長,這樣資料容易過期。記住,快取對於相對靜態的資料,或者頻繁被讀取的資料來說,更為有效。

2)驅逐資料

與儲存原始資料的資料儲存相比,快取的大小一般都有限制,在必要的時候,需要清理資料。大部分的快取使用最少最近使用策略來選擇需要驅逐的資料。但這是可以定製的。配置快取的全域性屬性和其他屬性,加上每個快取資料的過期屬性,來保證快取是具有成本效益的,因為全域性的驅逐策略,對於每個資料項來說,並不總是合適的。舉個例子,如果一個快取資料項從資料儲存載入資料是非常昂貴的,那麼,更有效的方式是,犧牲那些頻繁訪問,但是開銷更小的的專案,將這些資料一直留存在快取中。

3)啟動快取

很多解決方案會預先根據應用程式經常需要的資料,預先計算快取。並作為啟動過程的一部分。在這種場景下,當資料過期,或者被驅逐的時候,Cache-Aside模式仍然是有效的。

4)一致性

Cache-Aside模式並不能保證資料儲存和快取之間的一致性。資料儲存中的一個資料項,可能在任何時候被外部程序改變,這個改變無法被反射到快取中,直到下一次資料被載入。在一個存在跨資料來源的資料複製的系統中,如果同步頻繁發生,問題會變得很嚴重。

5)本地(記憶體)快取

一個快取可以被儲存到應用程式的本地記憶體中。在這種環境中,如果應用頻繁訪問相同的資料的話,Cache-Aside模式也是有效的。然而,本地快取是私有的,因此不同的應用例項都會持有相同資料的一份快取。這些快取可能會很快在各個應用程式例項之間變得不一致。因此,可能需要更頻繁的過期和重新整理儲存在私有快取中的資料。在這種場景下,需要研究是否需要使用共享快取或者分散式快取。

何時使用這個模式

當符合下面的條件時,可以使用:

1)快取不提供原生的read-through和wirte-through操作的支援

2)需要的資源是不可預測的,這個模式使得應用能夠按需載入資料,不會假設應用將會需要哪些資料。

在下面的情況下,模式可能不適用:

1)快取的資料集是靜態的,如果將資料載入到可用的快取空間,在應用程式啟動的時候啟動快取資料,並且適用某種策略防止快取失效。

2)快取會話狀態資訊在web應用中,在這種環境中,你應該避免在C/S程式中額外的引入依賴關係。