性能是所有微服務(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中國公眾號