微服務(wù)實(shí)踐目錄,可以參見(jiàn)連接。
緩存系列包括:
1.微服務(wù)管理-11.緩存概述
1.微服務(wù)管理-11.緩存-0.技術(shù)
1.微服務(wù)管理-11.緩存-1.多級(jí)緩存設(shè)計(jì)
1.微服務(wù)管理-11.緩存-2.典型緩存架構(gòu)設(shè)計(jì)
1.微服務(wù)管理-11.緩存-3.實(shí)踐
1.微服務(wù)管理-11.緩存-4.總結(jié)
背景
通過(guò)前面的文章說(shuō)明了緩存的基本內(nèi)容,但對(duì)于緩存來(lái)說(shuō)可以在網(wǎng)絡(luò)服務(wù)中的分層架構(gòu)中的任意一點(diǎn)都存在。從網(wǎng)絡(luò)服務(wù)分層架構(gòu)的最前端瀏覽器到最后端數(shù)據(jù)庫(kù)都使用了緩存技術(shù)。簡(jiǎn)單的看在網(wǎng)絡(luò)服務(wù)中的每一層中都有緩存,那就是多級(jí)緩存。
像CPU的Cache系統(tǒng)的緩存層級(jí)的劃分是因?yàn)镃PU在做著幾方面的權(quán)衡:速度、容量、晶體管體積、發(fā)熱量等。L1為了更快的訪問(wèn),用了更多/更大/更復(fù)雜的晶體管。而L2為了更大容量,選擇了更小/更簡(jiǎn)單的晶體管來(lái)實(shí)現(xiàn)。而在互聯(lián)網(wǎng)系統(tǒng)中應(yīng)該考慮哪些權(quán)衡點(diǎn)來(lái)設(shè)計(jì)不同級(jí)別的緩存就成了問(wèn)題。
分級(jí)原因
經(jīng)典和通用型的互聯(lián)網(wǎng)系統(tǒng)就是一個(gè)分層系統(tǒng),按照互聯(lián)網(wǎng)系統(tǒng)的分層概念在每一層上都有不同的緩存技術(shù)與處理方式?;ヂ?lián)網(wǎng)分層緩存技術(shù)可以參見(jiàn):一篇文章讓你明白你多級(jí)緩存的分層架構(gòu)。我們這里不討論分層架構(gòu)中每層中緩存技術(shù),這里討論從服務(wù)(業(yè)務(wù))接收到用戶請(qǐng)求后到服務(wù)(業(yè)務(wù))端作出響應(yīng)的這部分的緩存分級(jí)。
-
分級(jí)場(chǎng)景
那么在互聯(lián)網(wǎng)系統(tǒng)中為什么做緩存分級(jí)?答案就是解決“緩存雪崩”問(wèn)題。緩存雪崩就是指緩存由于某些原因(混存宕機(jī)、大面積數(shù)據(jù)過(guò)期),導(dǎo)致大量請(qǐng)求到達(dá)后端數(shù)據(jù)庫(kù)。進(jìn)一步促成數(shù)據(jù)庫(kù)崩潰,整個(gè)系統(tǒng)崩潰,發(fā)生災(zāi)難。
通過(guò)多級(jí)緩存解決緩存雪崩的問(wèn)題。一方面可以提高緩存的穩(wěn)定性,另一方面可以將分級(jí)緩存看作有一個(gè)更大的緩存。這個(gè)緩存池內(nèi)緩存著所有的數(shù)據(jù),只要通過(guò)緩存擊穿的各種機(jī)制將數(shù)據(jù)一級(jí)一級(jí)的提調(diào)到最高級(jí)緩存中以達(dá)到像CPU分級(jí)緩存一樣的要求。
除了緩存雪崩這個(gè)場(chǎng)景外,還有用戶分群,地域分群等業(yè)務(wù)數(shù)據(jù)緩存可能會(huì)用到緩存分級(jí)的方式處理。
-
與分布式緩存不同
分布式緩存是將緩存鏡像同步到其他的緩存服務(wù)上。而緩存分級(jí)是將緩存劃分為不同的層次,每一層存儲(chǔ)的都是下層數(shù)據(jù)的子集。一個(gè)是鏡像一個(gè)是子集,以這樣的方式實(shí)現(xiàn)緩存在不同場(chǎng)景下不同的解決方案。
關(guān)注點(diǎn)
緩存分級(jí)主要解決緩存雪崩的問(wèn)題。那么在解決這個(gè)問(wèn)題的過(guò)程中就需要對(duì)分級(jí)緩存的需要設(shè)計(jì)的點(diǎn)或著需要重點(diǎn)關(guān)注的點(diǎn)進(jìn)行梳理,并根據(jù)這些點(diǎn)進(jìn)行有針對(duì)行的設(shè)計(jì)工作。
-
同構(gòu)或者異構(gòu)
在《1.微服務(wù)管理-11.緩存概述》已經(jīng)說(shuō)明緩存的數(shù)據(jù)應(yīng)該是越靠近響應(yīng)的最終結(jié)果越好。這樣可以最大限度的減少因?yàn)闃I(yè)務(wù)代碼處理造成的延時(shí)問(wèn)題。每級(jí)緩存應(yīng)該保存同樣的數(shù)據(jù)還是保存不同的數(shù)據(jù)就成了問(wèn)題,最靠近業(yè)務(wù)服務(wù)的緩存是不是應(yīng)該最應(yīng)該是最終結(jié)果,而越靠近數(shù)據(jù)源的緩存是不是就應(yīng)該更傾向于結(jié)構(gòu)化數(shù)據(jù)。
透明化
緩存分層后對(duì)于研發(fā)人員來(lái)說(shuō)應(yīng)該是透明的。不應(yīng)牽扯到過(guò)多的業(yè)務(wù)代碼。使業(yè)務(wù)代碼和緩存代碼耦合的分層緩存。自動(dòng)化
各級(jí)緩存間的數(shù)據(jù)的同步應(yīng)該最好能夠自動(dòng)化??梢詮木彺娓碌姆绞街兄苯荧@取緩存映射邏輯,并根據(jù)邏輯自行更新與失效緩存。緩存擊穿后更新緩存需要有自動(dòng)化方法。
業(yè)界方案
從業(yè)務(wù)分級(jí)緩存設(shè)計(jì)到的技術(shù)方面來(lái)看,分級(jí)緩存可以在客戶端分級(jí)緩存和服務(wù)端分級(jí)緩存兩種方式。下面分別說(shuō)明這兩種方式的內(nèi)容:
-
客戶端分級(jí)緩存(Java)
Ehcache
Ehcache就是Hibernate緩存機(jī)制的緩存實(shí)現(xiàn)。而Hibernate本身就帶有一級(jí)緩存、二級(jí)緩存功能。J2Cache
J2Cache是一個(gè)Java的二級(jí)緩存框架。第一級(jí)緩存使用內(nèi)存(同時(shí)支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二級(jí)緩存使用 Redis(推薦)/Memcached 。 由于大量的緩存讀取會(huì)導(dǎo)致 L2 的網(wǎng)絡(luò)成為整個(gè)系統(tǒng)的瓶頸,因此 L1 的目標(biāo)是降低對(duì) L2 的讀取次數(shù)。 該緩存框架主要用于集群環(huán)境中。單機(jī)也可使用,用于避免應(yīng)用重啟導(dǎo)致的緩存冷啟動(dòng)后對(duì)后端業(yè)務(wù)的沖擊。layering-cache
layering-cache是一個(gè)支持分布式環(huán)境的多級(jí)緩存框架,使用方式和spring-cache類似,主要目的是在使用注解的時(shí)候支持配置過(guò)期時(shí)間。layering-cache其實(shí)是一個(gè)兩級(jí)緩存,一級(jí)緩存使用Caffeine作為本地緩存,二級(jí)緩存使用redis作為集中式緩存。并且基于redis的Pub/Sub做緩存的刪除,所以它是一個(gè)適用于分布式環(huán)境下的一個(gè)緩存系統(tǒng)。
-
服務(wù)端分級(jí)緩存
Redis Replication,Codis,Twemproxy都是服務(wù)端分布式緩存技術(shù),但通過(guò)調(diào)查發(fā)現(xiàn)所有的服務(wù)器緩存技術(shù)都不支持服務(wù)端分級(jí)緩存的。本想借助于Redis的Replication自行實(shí)現(xiàn)Redis的多級(jí)緩存支持,但是調(diào)查發(fā)現(xiàn)Redis的Miss事件是沒(méi)有對(duì)外公布的,無(wú)法使用Lua,watch進(jìn)行Miss事件獲取。所以,不能通過(guò)Miss事件進(jìn)行下一集緩存查詢。
設(shè)計(jì)
根據(jù)業(yè)界對(duì)于緩存的解決方案來(lái)說(shuō),對(duì)于服務(wù)端的緩存分級(jí)來(lái)說(shuō)場(chǎng)景不多。故這里就不進(jìn)行服務(wù)端緩存分級(jí)的考量。在這樣的前提下對(duì)緩存進(jìn)行分級(jí)。像CPU的緩存的方式一樣,作者將緩存距離業(yè)務(wù)服務(wù)的遠(yuǎn)近對(duì)緩存服務(wù)進(jìn)行分級(jí)。并說(shuō)明這些分級(jí)下一般的實(shí)現(xiàn)技術(shù)。第一級(jí)緩存是服務(wù)的本地緩存,第二季緩存是服務(wù)外緩存服務(wù)器協(xié)助緩存。
第一級(jí)緩存應(yīng)該存儲(chǔ)數(shù)據(jù)量不是很大,數(shù)據(jù)更新頻率較低的數(shù)據(jù)。一般情況下使用本地緩存作為第一級(jí)緩存。使用本地緩存的與微服務(wù)設(shè)計(jì)原則中的無(wú)狀態(tài)服務(wù)有相互沖突。這種沖突在分級(jí)緩存的實(shí)現(xiàn)中必須解決,解決這個(gè)問(wèn)題需要定義更好的緩存過(guò)期和緩存更新策略來(lái)解決。并分布式服務(wù)中每個(gè)服務(wù)都有多個(gè)實(shí)例,實(shí)例之間的緩存數(shù)據(jù)也需要進(jìn)行同步保證數(shù)據(jù)的一致性。
第二級(jí)緩存使用緩存服務(wù)的方式實(shí)現(xiàn)就會(huì)增加緩存獲取與操作過(guò)程中的進(jìn)程間通信時(shí)間,所以緩存與最好處于同一個(gè)網(wǎng)絡(luò)中,以減少網(wǎng)絡(luò)通信的消耗。
回顧上面所說(shuō)到的緩存分級(jí)注意事項(xiàng):同構(gòu)或者異構(gòu)、透明化、自動(dòng)化,通過(guò)對(duì)Ehcache可以解決上述說(shuō)有的注意點(diǎn)。不過(guò)所有的跟緩存相關(guān)的代碼都需要自行實(shí)現(xiàn),實(shí)現(xiàn)過(guò)程中操作異構(gòu)問(wèn)題、解決緩存代碼與業(yè)務(wù)代碼隔離問(wèn)題、解決自動(dòng)化更新問(wèn)題。
總結(jié)
分級(jí)緩存在一定等讀上解決系統(tǒng)可靠性,可用性問(wèn)題。并在此基礎(chǔ)上可以解決在地域IDC中對(duì)于地域用戶的數(shù)據(jù)的緩存與處理概念。以地域性劃分IDC以使用戶可以得到就近服務(wù),就近處理用戶的請(qǐng)求。分級(jí)緩存可以應(yīng)用解決技術(shù)問(wèn)題也可以解決業(yè)務(wù)數(shù)據(jù)問(wèn)題,可以在適用的場(chǎng)景中適用
參考
多級(jí)緩存——原理
多級(jí)緩存設(shè)計(jì)詳解 | 給數(shù)據(jù)庫(kù)減負(fù),刻不容緩!
有贊透明多級(jí)緩存解決方案(TMC)
千萬(wàn)級(jí)并發(fā)!如何設(shè)計(jì)一個(gè)多級(jí)緩存系統(tǒng)?
你所不知道的堆外緩存
一篇文章讓你明白你多級(jí)緩存的分層架構(gòu)
Cache為什么有那么多級(jí)?為什么一級(jí)比一級(jí)大?是不是Cache越大越好?
深入理解Redis Master-Slaver/Sentinel/Cluster原理
深入剖析Redis系列(三) - Redis集群模式搭建與原理詳解
復(fù)制(Replication)
如何基于 Redis Replication 設(shè)計(jì)并實(shí)現(xiàn) Redis-replicator?
Redis集群實(shí)現(xiàn)原理探討
集群教程