緩存的幾種架構(gòu)模式

性能是所有微服務(wù)成功的關(guān)鍵。只有在微服務(wù)設(shè)計,開發(fā)和交付整體過程中的各個環(huán)節(jié)上使用“性能友好型”技術(shù),才能得到一個良好的總體性能。

但在很多情況下,通過在數(shù)據(jù)消費(fèi)者與存儲數(shù)據(jù)的服務(wù)器之間的中間層采用各種基本技術(shù)(例如使用和優(yōu)化緩存),可以大幅改善性能。因為緩存使用內(nèi)存來提供更低的訪問延遲,因此能夠比位于磁盤的原數(shù)據(jù)庫更快地返回數(shù)據(jù)。同時,從網(wǎng)絡(luò)拓?fù)涞慕嵌葋碚f,緩存通常也更靠近數(shù)據(jù)消費(fèi)者。

緩存可以放到基礎(chǔ)架構(gòu)中任何存在數(shù)據(jù)傳輸瓶頸的地方。在這篇文章中,我們將主要介紹旁路緩存 (Look-Aside Caching),它是避免微服務(wù)從后端存儲中訪問數(shù)據(jù)的高性能替代方案。我們也會介紹各種緩存模式術(shù)語,如旁讀 (read-aside)、透讀 (read thru)、透寫 (write through) 和后寫 (write behind) 緩存,以及何時選擇不同的模式。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 旁路緩存與內(nèi)嵌緩存


緩存的兩種主要模式是旁路緩存模式和內(nèi)嵌緩存模式。這兩種模式的介紹與區(qū)別如下表所示。

旁路緩存基礎(chǔ)知識

在旁路緩存模式中,如果數(shù)據(jù)未緩存,應(yīng)用便從后端存儲中獲取數(shù)據(jù),并將數(shù)據(jù)放入緩存中以備后續(xù)讀取。

這種模式的優(yōu)勢在于它不需要開發(fā)人員向緩存服務(wù)器中部署任何代碼。相反,旁路模式讓開發(fā)人員和應(yīng)用代碼負(fù)責(zé)管理緩存。但緩存控制這個優(yōu)勢,也需要和緩存管理成本一起考慮。

Spring Framework 等開發(fā)框架可通過緩存抽象來減輕這種負(fù)擔(dān),緩存抽象可為開發(fā)人員提供一種統(tǒng)一機(jī)制來使用緩存,而無需考慮采用哪種具體的緩存技術(shù)。這種抽象提供了一套 Java 注釋(如針對方法的 @Cacheable 注釋),當(dāng)出現(xiàn)緩存缺失時執(zhí)行函數(shù)并緩存結(jié)果。開發(fā)人員可以學(xué)習(xí)和使用 Spring 的緩存抽象,而不用了解各種緩存技術(shù)相關(guān)的內(nèi)部細(xì)節(jié)。同事,緩存內(nèi)置的數(shù)據(jù)生命周期管理功能也可以進(jìn)一步減輕緩存的管理成本。

旁路緩存主要用于不經(jīng)常變化的數(shù)據(jù), 就是我們經(jīng)常說到的“一寫多讀”場景。如果后端存儲中的數(shù)據(jù)變化很快,那么條目失效的通知數(shù)量會大幅增加,這會大幅削弱緩存的優(yōu)勢。

在應(yīng)用層具有更多控制

與內(nèi)嵌緩存相反,旁路緩存是聲明性的:開發(fā)人員需要告訴應(yīng)用需要緩存什么,而不是如何緩存。而使用內(nèi)嵌緩存時,開發(fā)人員必須將代碼部署到緩存服務(wù)器中,同時開發(fā)人員也必須明確的處理緩存未命中的情況

開發(fā)人員可以根據(jù)業(yè)務(wù)需要部署代碼,以完成將寫入緩存的操作以同步或者異步的方式寫到后端存儲中。

因此,內(nèi)嵌緩存模式和旁路緩存模式的關(guān)鍵區(qū)別在于應(yīng)用層代碼和緩存負(fù)責(zé)內(nèi)容。

在旁路緩存模式中,在應(yīng)用層的控制力更大。而在內(nèi)嵌緩存模式中,代碼部署到緩存服務(wù)器,由緩存負(fù)責(zé)控制和后端存儲之間的讀寫交互。


轉(zhuǎn)自 pivotal中國公眾號

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容