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