應用快取預熱方案設計
背景
隨著業務的發展,微服務越來越多,快取相關的場景也比較多,通常的做法是基於快取資料庫(如redis),client來進行快取操作。這樣的問題有兩個
-
如果更換快取資料庫改造成本比較高
-
對於批量查快取、快取穿透等場景沒有統一實現,邏輯分散
所以需要一個統一的快取框架。
另外針對一些活動、大促場景需要對快取資料進行預熱。所以需要設計一套通用的預熱系統。所謂預熱,其實就是提前請求資料,使快取生效。快取和預熱有關聯,但是可以設計成獨立的兩套系統。
快取框架
目標是實現
-
去除樣板程式碼
getDataWithCache(Long id) {
val data = getFromCache(id);
// 快取沒有,從資料庫中拿
if (data == null) {
data = getFromDb(id);
putDataInfoCache();
}
}
-
遮蔽掉快取的具體實現,快取有本地快取(guava cache),分散式快取(redis,memcache),實現方式不同,但是對於業務無需感知
-
支援快取穿透、快取擊穿、級聯快取、批量查詢快取場景
-
能夠監控到快取命中率
實現分析
API 層
提供一些annotation給開發者使用
解析層
解析annotation,生成對應的快取操作API
快取操作SPI
遮蔽掉具體的快取資料庫實現
快取操作層
具體的快取資料庫實現,如redis,memcache
開源的實現
http://docs.spring.io/spring-framework/docs/3.1.x/spring-framework-reference/html/cache.html
目前有spring-cache的實現,大部分需要的功能都能提供,不過也存在一些劣勢
-
不支援多級快取,批量查詢快取
-
和公司內部的監控,全鏈路trace沒有打通。
所以通常可以借鑑spring-cache思路,結合公司的基礎元件,自研一套。具體實現邏輯見github
預熱系統
預熱系統其實就是三步
-
構造資料 支援excel,離線表,等多種資料匯出成特定格式的引數
-
提交任務 提交呼叫待預熱介面的方法,有個任務中心即可
-
執行 任務中心的任務排程
所以主要是搭建一個數據構造模組,再基於公司已有的任務執行中心即可實現。