軟件架構(gòu)中的跨層緩存
譯文?譯者 | 李睿
審校 | 孫淑娟
本文面向軟件開(kāi)發(fā)人員、技術(shù)經(jīng)理、軟件架構(gòu)師、測(cè)試工程師以及其他有興趣了解如何在軟件系統(tǒng)中使用緩存的人員。
1.緩存是什么?
(1)為什么需要緩存
如今,現(xiàn)代軟件系統(tǒng)變得越來(lái)越分散和復(fù)雜,帶來(lái)了許多挑戰(zhàn)和問(wèn)題,尤其是與系統(tǒng)性能相關(guān)的問(wèn)題。系統(tǒng)運(yùn)行緩慢可能會(huì)導(dǎo)致企業(yè)失去信譽(yù)和盈利能力。
下圖顯示了現(xiàn)代分布式架構(gòu)的一個(gè)非常簡(jiǎn)單的視圖。需要注意的是,實(shí)際架構(gòu)會(huì)更加復(fù)雜,因?yàn)樵S多微服務(wù)(內(nèi)部和外部)作為流程的一部分執(zhí)行。在系統(tǒng)設(shè)計(jì)中還會(huì)有其他組件,例如消息傳遞系統(tǒng)、LDAP、規(guī)則引擎等。
軟件系統(tǒng)的層級(jí)如上圖所示,不同組件之間存在大量的交互,需要跳轉(zhuǎn)來(lái)完成單個(gè)請(qǐng)求。由于組件的處理時(shí)間和等待下游組件響應(yīng)的等待時(shí)間的累積,將會(huì)增加每個(gè)接觸點(diǎn)的延遲。
需要注意的是,處理時(shí)間可能是由于應(yīng)用程序本身或下游系統(tǒng)所花費(fèi)的時(shí)間,也可能是由于網(wǎng)絡(luò)(例如DNS查找、建立連接、網(wǎng)絡(luò)傳輸時(shí)間等)的延遲。
緩存通過(guò)將數(shù)據(jù)副本保存在應(yīng)用程序的客戶(hù)端/組件附近來(lái)幫助提高系統(tǒng)性能來(lái)發(fā)揮重要作用。
(2)緩存的工作原理
如上圖所示,軟件系統(tǒng)中可以有不同的層和交互。緩存可以應(yīng)用于任何一層,但緩存操作的基本原理保持不變。緩存數(shù)據(jù)將用于避免代昂貴的網(wǎng)絡(luò)跳變、來(lái)自底層數(shù)據(jù)庫(kù)的調(diào)用或存儲(chǔ)速度較慢的存儲(chǔ)系統(tǒng)。下圖顯示了緩存在特定場(chǎng)景中的工作方式。這可以通過(guò)以下步驟順序來(lái)解釋。需要注意,在各種場(chǎng)景中緩存的實(shí)現(xiàn)可能會(huì)有所不同,但在較高層次上,基本方法保持不變。
- 系統(tǒng)/組件接收發(fā)送回請(qǐng)求數(shù)據(jù)的請(qǐng)求。
- 它將檢查請(qǐng)求的數(shù)據(jù)是否在緩存中。
- 如果數(shù)據(jù)在緩存中,將返回相同的緩存數(shù)據(jù)。
- 否則,系統(tǒng)將從源(例如數(shù)據(jù)庫(kù)、外部系統(tǒng)或API調(diào)用)獲取數(shù)據(jù),并將使用這數(shù)據(jù)填充緩存。
- 最后,此數(shù)據(jù)將返回給調(diào)用者。
(3)使用緩存的優(yōu)點(diǎn)
- 更好的應(yīng)用程序性能:使用緩存的主要優(yōu)點(diǎn)是它提高了應(yīng)用程序的性能。由于所請(qǐng)求的數(shù)據(jù)通常在更靠近應(yīng)用程序的地方可用,因此在快速內(nèi)存訪問(wèn)中,它可以被返回并重新用于進(jìn)一步處理。這有助于提高應(yīng)用程序的性能。
- 避免不必要的磁盤(pán)訪問(wèn)/網(wǎng)絡(luò)跳變:由于請(qǐng)求的數(shù)據(jù)通常在靠近應(yīng)用程序的地方可用,在快速的內(nèi)存訪問(wèn)中,這可以幫助避免不必要的跳變到較慢的組件,例如數(shù)據(jù)庫(kù)、磁盤(pán)或調(diào)用其他組件/系統(tǒng)通過(guò)網(wǎng)絡(luò)。這也有助于提高應(yīng)用程序性能。
- 更好的數(shù)據(jù)庫(kù)擴(kuò)展性:由于現(xiàn)在對(duì)數(shù)據(jù)庫(kù)的查詢(xún)減少了,其容量被釋放來(lái)處理其他請(qǐng)求。這可以減少數(shù)據(jù)庫(kù)負(fù)載/成本,并提高可擴(kuò)展性。其他后端系統(tǒng)/組件也是如此。
(4)使用緩存時(shí)的重要注意事項(xiàng)
在為給定場(chǎng)景設(shè)計(jì)緩存框架時(shí),必須做出一些重要的決定。以下是緩存設(shè)計(jì)的一些關(guān)鍵方面的總結(jié):
- 應(yīng)該緩存多少數(shù)據(jù)?
- 在緩存中插入新數(shù)據(jù)時(shí),哪些數(shù)據(jù)必須刪除或保留?
- 緩存中的數(shù)據(jù)是否仍然相關(guān),或者是否過(guò)時(shí)?
- 如何使緩存中的數(shù)據(jù)保持最新?
- 如何保持更低的緩存未命中率?
緩存的類(lèi)型/風(fēng)格和各種緩存策略方法將在以下部分中討論。以下了解這些影響緩存的行為,并解決上面提出的一些問(wèn)題。
(5)多種風(fēng)格的緩存
本文將討論通常用于管理底層數(shù)據(jù)存儲(chǔ)更新場(chǎng)景的各種策略。如上所述,緩存未命中率應(yīng)保持在較低水平。
緩存未命中是指在緩存中找不到請(qǐng)求的數(shù)據(jù)的情況,而緩存命中是指在緩存中找到請(qǐng)求的數(shù)據(jù)且無(wú)需從源中檢索的情況。
為了保持更低的緩存未命中率,緩存數(shù)據(jù)應(yīng)保持最新?tīng)顟B(tài)。根據(jù)應(yīng)用程序模式的不同,可以使用以下技術(shù)之一來(lái)確保緩存中的數(shù)據(jù)盡可能是最新的。
- 直寫(xiě)緩存:在這種技術(shù)中,數(shù)據(jù)首先在緩存中更新,然后是源系統(tǒng)。這將確保緩存始終具有最近更新的數(shù)據(jù)。但是,這會(huì)導(dǎo)致源系統(tǒng)上發(fā)生的寫(xiě)入操作延遲。如果應(yīng)用程序是寫(xiě)密集型的,則不建議使用這一方法。
- 回寫(xiě)緩存:為了克服直寫(xiě)緩存的問(wèn)題,可以使用回寫(xiě)緩存技術(shù)。同樣在這種情況下,緩存也是首先更新的。但是,緩存中的更新數(shù)據(jù)會(huì)異步同步回源系統(tǒng)。如果應(yīng)用程序需要更高級(jí)別的源系統(tǒng)一致性,這并不是讓人推薦的技術(shù)。
- 繞寫(xiě)緩存:在這種技術(shù)中,數(shù)據(jù)直接在源系統(tǒng)中更新。緩存將定期刷新,以更新數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù)。這有可能會(huì)獲取過(guò)時(shí)數(shù)據(jù)或提高緩存未命中率。
2.緩存刷新策略示例
以下總結(jié)了一些用于刷新緩存內(nèi)容的最流行的技術(shù),可能有多種原因需要刷新緩存。由于緩存大小通常比源小得多,因此并非所有數(shù)據(jù)都可以緩存。隨著緩存大小隨時(shí)間增長(zhǎng),它可能會(huì)變滿(mǎn)。采用更需要或更常用的數(shù)據(jù)替換緩存中的舊數(shù)據(jù)將降低緩存未命中率。以下是刷新緩存項(xiàng)目的常用技術(shù)列表。
(1)最近使用(MRU):在這種技術(shù)中,最近使用的緩存項(xiàng)目首先被丟棄,并被新項(xiàng)目替換。
(2)最近最少使用(LRU):在這種技術(shù)中,最近最少使用的項(xiàng)目首先被丟棄,并被新項(xiàng)目替換。
(3)先進(jìn)先出(FIFO):在這種技術(shù)中,要插入緩存的第一個(gè)項(xiàng)目首先被丟棄,并被新項(xiàng)目替換。
(4)后進(jìn)先出(LIFO):在這種技術(shù)中,要插入緩存中的最后一個(gè)項(xiàng)目首先被丟棄,并被新項(xiàng)目替換。
(5)最近最不常用(LFU):在這種技術(shù)中,緩存中使用最少的項(xiàng)目首先被丟棄,并被新項(xiàng)目替換。
(6)最常用(MFU):在這種技術(shù)中,緩存中最常用的項(xiàng)目首先被丟棄,并被新項(xiàng)目替換。
3. 跨層緩存
下表總結(jié)了如何在軟件系統(tǒng)中跨層使用緩存,還重點(diǎn)介紹了一些工具/框架,它們可用于在給定場(chǎng)景中實(shí)現(xiàn)緩存。
需要注意的是,在軟件應(yīng)用程序中,緩存可以應(yīng)用于一層或多層。
原文鏈接:https://dzone.com/articles/caching-across-layers-in-software-architecture?