微服務(wù)實踐目錄,可以參見連接芦缰。
緩存系列包括:
1.微服務(wù)管理-11.緩存概述
1.微服務(wù)管理-11.緩存-0.技術(shù)
1.微服務(wù)管理-11.緩存-1.多級緩存設(shè)計
1.微服務(wù)管理-11.緩存-2.典型緩存架構(gòu)設(shè)計
1.微服務(wù)管理-11.緩存-3.實踐
1.微服務(wù)管理-11.緩存-4.總結(jié)
背景
通過前面的文章說明了緩存的基本內(nèi)容,但對于緩存來說可以在網(wǎng)絡(luò)服務(wù)中的分層架構(gòu)中的任意一點(diǎn)都存在枫慷。從網(wǎng)絡(luò)服務(wù)分層架構(gòu)的最前端瀏覽器到最后端數(shù)據(jù)庫都使用了緩存技術(shù)让蕾。簡單的看在網(wǎng)絡(luò)服務(wù)中的每一層中都有緩存浪规,那就是多級緩存。
像CPU的Cache系統(tǒng)的緩存層級的劃分是因為CPU在做著幾方面的權(quán)衡:速度探孝、容量笋婿、晶體管體積、發(fā)熱量等顿颅。L1為了更快的訪問萌抵,用了更多/更大/更復(fù)雜的晶體管。而L2為了更大容量元镀,選擇了更小/更簡單的晶體管來實現(xiàn)绍填。而在互聯(lián)網(wǎng)系統(tǒng)中應(yīng)該考慮哪些權(quán)衡點(diǎn)來設(shè)計不同級別的緩存就成了問題。
分級原因
經(jīng)典和通用型的互聯(lián)網(wǎng)系統(tǒng)就是一個分層系統(tǒng)栖疑,按照互聯(lián)網(wǎng)系統(tǒng)的分層概念在每一層上都有不同的緩存技術(shù)與處理方式讨永。互聯(lián)網(wǎng)分層緩存技術(shù)可以參見:一篇文章讓你明白你多級緩存的分層架構(gòu)遇革。我們這里不討論分層架構(gòu)中每層中緩存技術(shù)卿闹,這里討論從服務(wù)(業(yè)務(wù))接收到用戶請求后到服務(wù)(業(yè)務(wù))端作出響應(yīng)的這部分的緩存分級。
-
分級場景
那么在互聯(lián)網(wǎng)系統(tǒng)中為什么做緩存分級萝快?答案就是解決“緩存雪崩”問題锻霎。緩存雪崩就是指緩存由于某些原因(混存宕機(jī)、大面積數(shù)據(jù)過期)揪漩,導(dǎo)致大量請求到達(dá)后端數(shù)據(jù)庫旋恼。進(jìn)一步促成數(shù)據(jù)庫崩潰,整個系統(tǒng)崩潰奄容,發(fā)生災(zāi)難冰更。
通過多級緩存解決緩存雪崩的問題。一方面可以提高緩存的穩(wěn)定性昂勒,另一方面可以將分級緩存看作有一個更大的緩存蜀细。這個緩存池內(nèi)緩存著所有的數(shù)據(jù),只要通過緩存擊穿的各種機(jī)制將數(shù)據(jù)一級一級的提調(diào)到最高級緩存中以達(dá)到像CPU分級緩存一樣的要求戈盈。
除了緩存雪崩這個場景外奠衔,還有用戶分群,地域分群等業(yè)務(wù)數(shù)據(jù)緩存可能會用到緩存分級的方式處理塘娶。
-
與分布式緩存不同
分布式緩存是將緩存鏡像同步到其他的緩存服務(wù)上归斤。而緩存分級是將緩存劃分為不同的層次,每一層存儲的都是下層數(shù)據(jù)的子集血柳。一個是鏡像一個是子集官册,以這樣的方式實現(xiàn)緩存在不同場景下不同的解決方案生兆。
關(guān)注點(diǎn)
緩存分級主要解決緩存雪崩的問題难捌。那么在解決這個問題的過程中就需要對分級緩存的需要設(shè)計的點(diǎn)或著需要重點(diǎn)關(guān)注的點(diǎn)進(jìn)行梳理膝宁,并根據(jù)這些點(diǎn)進(jìn)行有針對行的設(shè)計工作。
-
同構(gòu)或者異構(gòu)
在《1.微服務(wù)管理-11.緩存概述》已經(jīng)說明緩存的數(shù)據(jù)應(yīng)該是越靠近響應(yīng)的最終結(jié)果越好根吁。這樣可以最大限度的減少因為業(yè)務(wù)代碼處理造成的延時問題员淫。每級緩存應(yīng)該保存同樣的數(shù)據(jù)還是保存不同的數(shù)據(jù)就成了問題,最靠近業(yè)務(wù)服務(wù)的緩存是不是應(yīng)該最應(yīng)該是最終結(jié)果击敌,而越靠近數(shù)據(jù)源的緩存是不是就應(yīng)該更傾向于結(jié)構(gòu)化數(shù)據(jù)介返。
透明化
緩存分層后對于研發(fā)人員來說應(yīng)該是透明的。不應(yīng)牽扯到過多的業(yè)務(wù)代碼沃斤。使業(yè)務(wù)代碼和緩存代碼耦合的分層緩存圣蝎。自動化
各級緩存間的數(shù)據(jù)的同步應(yīng)該最好能夠自動化『馄浚可以從緩存更新的方式中直接獲取緩存映射邏輯徘公,并根據(jù)邏輯自行更新與失效緩存。緩存擊穿后更新緩存需要有自動化方法哮针。
業(yè)界方案
從業(yè)務(wù)分級緩存設(shè)計到的技術(shù)方面來看关面,分級緩存可以在客戶端分級緩存和服務(wù)端分級緩存兩種方式。下面分別說明這兩種方式的內(nèi)容:
-
客戶端分級緩存(Java)
Ehcache
Ehcache就是Hibernate緩存機(jī)制的緩存實現(xiàn)十厢。而Hibernate本身就帶有一級緩存等太、二級緩存功能。J2Cache
J2Cache是一個Java的二級緩存框架蛮放。第一級緩存使用內(nèi)存(同時支持 Ehcache 2.x缩抡、Ehcache 3.x 和 Caffeine),第二級緩存使用 Redis(推薦)/Memcached 包颁。 由于大量的緩存讀取會導(dǎo)致 L2 的網(wǎng)絡(luò)成為整個系統(tǒng)的瓶頸缝其,因此 L1 的目標(biāo)是降低對 L2 的讀取次數(shù)。 該緩存框架主要用于集群環(huán)境中徘六。單機(jī)也可使用内边,用于避免應(yīng)用重啟導(dǎo)致的緩存冷啟動后對后端業(yè)務(wù)的沖擊。layering-cache
layering-cache是一個支持分布式環(huán)境的多級緩存框架待锈,使用方式和spring-cache類似漠其,主要目的是在使用注解的時候支持配置過期時間。layering-cache其實是一個兩級緩存竿音,一級緩存使用Caffeine作為本地緩存和屎,二級緩存使用redis作為集中式緩存。并且基于redis的Pub/Sub做緩存的刪除春瞬,所以它是一個適用于分布式環(huán)境下的一個緩存系統(tǒng)柴信。
-
服務(wù)端分級緩存
Redis Replication,Codis宽气,Twemproxy都是服務(wù)端分布式緩存技術(shù)随常,但通過調(diào)查發(fā)現(xiàn)所有的服務(wù)器緩存技術(shù)都不支持服務(wù)端分級緩存的潜沦。本想借助于Redis的Replication自行實現(xiàn)Redis的多級緩存支持,但是調(diào)查發(fā)現(xiàn)Redis的Miss事件是沒有對外公布的绪氛,無法使用Lua唆鸡,watch進(jìn)行Miss事件獲取。所以枣察,不能通過Miss事件進(jìn)行下一集緩存查詢争占。
設(shè)計
根據(jù)業(yè)界對于緩存的解決方案來說,對于服務(wù)端的緩存分級來說場景不多序目。故這里就不進(jìn)行服務(wù)端緩存分級的考量臂痕。在這樣的前提下對緩存進(jìn)行分級。像CPU的緩存的方式一樣猿涨,作者將緩存距離業(yè)務(wù)服務(wù)的遠(yuǎn)近對緩存服務(wù)進(jìn)行分級刻蟹。并說明這些分級下一般的實現(xiàn)技術(shù)。第一級緩存是服務(wù)的本地緩存嘿辟,第二季緩存是服務(wù)外緩存服務(wù)器協(xié)助緩存舆瘪。
第一級緩存應(yīng)該存儲數(shù)據(jù)量不是很大,數(shù)據(jù)更新頻率較低的數(shù)據(jù)红伦。一般情況下使用本地緩存作為第一級緩存英古。使用本地緩存的與微服務(wù)設(shè)計原則中的無狀態(tài)服務(wù)有相互沖突。這種沖突在分級緩存的實現(xiàn)中必須解決昙读,解決這個問題需要定義更好的緩存過期和緩存更新策略來解決召调。并分布式服務(wù)中每個服務(wù)都有多個實例,實例之間的緩存數(shù)據(jù)也需要進(jìn)行同步保證數(shù)據(jù)的一致性蛮浑。
第二級緩存使用緩存服務(wù)的方式實現(xiàn)就會增加緩存獲取與操作過程中的進(jìn)程間通信時間唠叛,所以緩存與最好處于同一個網(wǎng)絡(luò)中,以減少網(wǎng)絡(luò)通信的消耗沮稚。
回顧上面所說到的緩存分級注意事項:同構(gòu)或者異構(gòu)艺沼、透明化、自動化蕴掏,通過對Ehcache可以解決上述說有的注意點(diǎn)障般。不過所有的跟緩存相關(guān)的代碼都需要自行實現(xiàn),實現(xiàn)過程中操作異構(gòu)問題盛杰、解決緩存代碼與業(yè)務(wù)代碼隔離問題挽荡、解決自動化更新問題。
總結(jié)
分級緩存在一定等讀上解決系統(tǒng)可靠性即供,可用性問題定拟。并在此基礎(chǔ)上可以解決在地域IDC中對于地域用戶的數(shù)據(jù)的緩存與處理概念。以地域性劃分IDC以使用戶可以得到就近服務(wù)逗嫡,就近處理用戶的請求青自。分級緩存可以應(yīng)用解決技術(shù)問題也可以解決業(yè)務(wù)數(shù)據(jù)問題株依,可以在適用的場景中適用
參考
多級緩存——原理
多級緩存設(shè)計詳解 | 給數(shù)據(jù)庫減負(fù),刻不容緩性穿!
有贊透明多級緩存解決方案(TMC)
千萬級并發(fā)!如何設(shè)計一個多級緩存系統(tǒng)雷滚?
你所不知道的堆外緩存
一篇文章讓你明白你多級緩存的分層架構(gòu)
Cache為什么有那么多級需曾?為什么一級比一級大?是不是Cache越大越好祈远?
深入理解Redis Master-Slaver/Sentinel/Cluster原理
深入剖析Redis系列(三) - Redis集群模式搭建與原理詳解
復(fù)制(Replication)
如何基于 Redis Replication 設(shè)計并實現(xiàn) Redis-replicator呆万?
Redis集群實現(xiàn)原理探討
集群教程