




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)現(xiàn)多級(jí)緩存架構(gòu)設(shè)計(jì)方案為什么要做TMC多級(jí)緩存解決方案的痛點(diǎn)TMC整體架構(gòu)TMC本地緩存如何透明整體結(jié)構(gòu)熱點(diǎn)發(fā)現(xiàn)整體流程數(shù)據(jù)收集熱度滑窗熱度匯聚熱點(diǎn)探測(cè)特性總結(jié)實(shí)戰(zhàn)效果快手商家某次商品營(yíng)銷(xiāo)活動(dòng)雙十一期間部分應(yīng)用TMC效果展示**功能展望TMC,即“透明多級(jí)緩存(TransparentMultilevelCache)”,是有贊PaaS團(tuán)隊(duì)給公司內(nèi)應(yīng)用提供的整體緩存解決方案。TMC在通用“分布式緩存解決方案(如CodisProxy+Redis,如有贊自研分布式緩存系統(tǒng)zanKV)”基礎(chǔ)上,增加了以下功能:應(yīng)用層熱點(diǎn)探測(cè)應(yīng)用層本地緩存應(yīng)用層緩存命中統(tǒng)計(jì)以幫助應(yīng)用層解決緩存使用過(guò)程中出現(xiàn)的熱點(diǎn)訪問(wèn)問(wèn)題。為什么要做TMC使用有贊服務(wù)的電商商家數(shù)量和類(lèi)型很多,商家會(huì)不定期做一些“商品秒殺”、“商品推廣”活動(dòng),導(dǎo)致“營(yíng)銷(xiāo)活動(dòng)”、“商品詳情”、“交易下單”等鏈路應(yīng)用出現(xiàn)緩存熱點(diǎn)訪問(wèn)的情況:活動(dòng)時(shí)間、活動(dòng)類(lèi)型、活動(dòng)商品之類(lèi)的信息不可預(yù)期,導(dǎo)致緩存熱點(diǎn)訪問(wèn)情況不可提前預(yù)知;緩存熱點(diǎn)訪問(wèn)出現(xiàn)期間,應(yīng)用層少數(shù)
熱點(diǎn)訪問(wèn)key
產(chǎn)生大量緩存訪問(wèn)請(qǐng)求:沖擊分布式緩存系統(tǒng),大量占據(jù)內(nèi)網(wǎng)帶寬,最終影響應(yīng)用層系統(tǒng)穩(wěn)定性;為了應(yīng)對(duì)以上問(wèn)題,需要一個(gè)能夠自動(dòng)發(fā)現(xiàn)熱點(diǎn)并將熱點(diǎn)緩存訪問(wèn)請(qǐng)求前置在應(yīng)用層本地緩存的解決方案,這就是TMC產(chǎn)生的原因。多級(jí)緩存解決方案的痛點(diǎn)基于上述描述,我們總結(jié)了下列
多級(jí)緩存解決方案需要解決的需求痛點(diǎn):熱點(diǎn)探測(cè):如何快速且準(zhǔn)確的發(fā)現(xiàn)
熱點(diǎn)訪問(wèn)key
?數(shù)據(jù)一致性:前置在應(yīng)用層的本地緩存,如何保障與分布式緩存系統(tǒng)的數(shù)據(jù)一致性?效果驗(yàn)證:如何讓?xiě)?yīng)用層查看本地緩存命中率、熱點(diǎn)key等數(shù)據(jù),驗(yàn)證多級(jí)緩存效果?透明接入:整體解決方案如何減少對(duì)應(yīng)用系統(tǒng)的入侵,做到快速平滑接入?TMC聚焦上述痛點(diǎn),設(shè)計(jì)并實(shí)現(xiàn)了整體解決方案。以支持“熱點(diǎn)探測(cè)”和“本地緩存”,減少熱點(diǎn)訪問(wèn)時(shí)對(duì)下游分布式緩存服務(wù)的沖擊,避免影響應(yīng)用服務(wù)的性能及穩(wěn)定性。TMC整體架構(gòu)TMC整體架構(gòu)如上圖,共分為三層:存儲(chǔ)層:提供基礎(chǔ)的kv數(shù)據(jù)存儲(chǔ)能力,針對(duì)不同的業(yè)務(wù)場(chǎng)景選用不同的存儲(chǔ)服務(wù)(codis/zankv/aerospike);代理層:為應(yīng)用層提供統(tǒng)一的緩存使用入口及通信協(xié)議,承擔(dān)分布式數(shù)據(jù)水平切分后的路由功能轉(zhuǎn)發(fā)工作;應(yīng)用層:提供統(tǒng)一客戶(hù)端給應(yīng)用服務(wù)使用,內(nèi)置“熱點(diǎn)探測(cè)”、“本地緩存”等功能,對(duì)業(yè)務(wù)透明;本篇聚焦在應(yīng)用層客戶(hù)端的“熱點(diǎn)探測(cè)”、“本地緩存”功能。TMC本地緩存如何透明TMC是如何減少對(duì)業(yè)務(wù)應(yīng)用系統(tǒng)的入侵,做到透明接入的?對(duì)于公司Java應(yīng)用服務(wù),在緩存客戶(hù)端使用方式上分為兩類(lèi):基于
spring.data.redis包,使用
RedisTemplate編寫(xiě)業(yè)務(wù)代碼;基于
youzan.framework.redis包,使用
RedisClient編寫(xiě)業(yè)務(wù)代碼;不論使用以上那種方式,最終通過(guò)
JedisPool創(chuàng)建的
Jedis對(duì)象與緩存服務(wù)端代理層做請(qǐng)求交互。TMC對(duì)原生jedis包的
JedisPool和
Jedis類(lèi)做了改造,在JedisPool初始化過(guò)程中集成TMC“熱點(diǎn)發(fā)現(xiàn)”+“本地緩存”功能
Hermes-SDK包的初始化邏輯使
Jedis客戶(hù)端與緩存服務(wù)端代理層交互時(shí)先與
Hermes-SDK交互,從而完成“熱點(diǎn)探測(cè)”+“本地緩存”功能的透明接入。對(duì)于Java應(yīng)用服務(wù),只需使用特定版本的jedis-jar包,無(wú)需修改代碼,即可接入TMC使用“熱點(diǎn)發(fā)現(xiàn)”+“本地緩存”功能,做到了對(duì)應(yīng)用系統(tǒng)的最小入侵。整體結(jié)構(gòu)模塊劃分TMC本地緩存整體結(jié)構(gòu)分為如下模塊:Jedis-Client:Java應(yīng)用與緩存服務(wù)端交互的直接入口,接口定義與原生Jedis-Client無(wú)異;Hermes-SDK:自研“熱點(diǎn)發(fā)現(xiàn)+本地緩存”功能的SDK封裝,Jedis-Client通過(guò)與它交互來(lái)集成相應(yīng)能力;Hermes服務(wù)端集群:接收Hermes-SDK上報(bào)的緩存訪問(wèn)數(shù)據(jù),進(jìn)行熱點(diǎn)探測(cè),將熱點(diǎn)key推送給Hermes-SDK做本地緩存;緩存集群:由代理層和存儲(chǔ)層組成,為應(yīng)用客戶(hù)端提供統(tǒng)一的分布式緩存服務(wù)入口;基礎(chǔ)組件:etcd集群、Apollo配置中心,為T(mén)MC提供“集群推送”和“統(tǒng)一配置”能力;基本流程1)key值獲取Java應(yīng)用調(diào)用
Jedis-Client
接口獲取key的緩存值時(shí),Jedis-Client
會(huì)詢(xún)問(wèn)
Hermes-SDK
該key當(dāng)前是否是
熱點(diǎn)key;對(duì)于
熱點(diǎn)key
,直接從
Hermes-SDK
的熱點(diǎn)模塊獲取熱點(diǎn)key在本地緩存的value值,不去訪問(wèn)
緩存集群
,從而將訪問(wèn)請(qǐng)求前置在應(yīng)用層;對(duì)于非
熱點(diǎn)key
,Hermes-SDK
會(huì)通過(guò)
Callable回調(diào)
Jedis-Client
的原生接口,從
緩存集群
拿到value值;對(duì)于
Jedis-Client
的每次key值訪問(wèn)請(qǐng)求,Hermes-SDK
都會(huì)通過(guò)其通信模塊將
key訪問(wèn)事件
異步上報(bào)給
Hermes服務(wù)端集群
,以便其根據(jù)上報(bào)數(shù)據(jù)進(jìn)行“熱點(diǎn)探測(cè)”;2)key值過(guò)期Java應(yīng)用調(diào)用
Jedis-Client
的
set()
del()
expire()接口時(shí)會(huì)導(dǎo)致對(duì)應(yīng)key值失效,Jedis-Client
會(huì)同步調(diào)用
Hermes-SDK
的
invalid()方法告知其“key值失效”事件;對(duì)于
熱點(diǎn)key
,Hermes-SDK
的熱點(diǎn)模塊會(huì)先將key在本地緩存的value值失效,以達(dá)到本地?cái)?shù)據(jù)強(qiáng)一致。同時(shí)通信模塊會(huì)異步將“key值失效”事件通過(guò)
etcd集群
推送給Java應(yīng)用集群中其他
Hermes-SDK
節(jié)點(diǎn);其他
Hermes-SDK
節(jié)點(diǎn)的通信模塊收到“key值失效”事件后,會(huì)調(diào)用熱點(diǎn)模塊將key在本地緩存的value值失效,以達(dá)到集群數(shù)據(jù)最終一致;3)熱點(diǎn)發(fā)現(xiàn)Hermes服務(wù)端集群
不斷收集
Hermes-SDK上報(bào)的
key訪問(wèn)事件,對(duì)不同業(yè)務(wù)應(yīng)用集群的緩存訪問(wèn)數(shù)據(jù)進(jìn)行周期性(3s一次)分析計(jì)算,以探測(cè)業(yè)務(wù)應(yīng)用集群中的熱點(diǎn)key列表;對(duì)于探測(cè)到的熱點(diǎn)key列表,Hermes服務(wù)端集群
將其通過(guò)
etcd集群
推送給不同業(yè)務(wù)應(yīng)用集群的
Hermes-SDK
通信模塊,通知其對(duì)熱點(diǎn)key列表進(jìn)行本地緩存;4)配置讀取Hermes-SDK
在啟動(dòng)及運(yùn)行過(guò)程中,會(huì)從
Apollo配置中心
讀取其關(guān)心的配置信息(如:?jiǎn)?dòng)關(guān)閉配置、黑白名單配置、etcd地址…);Hermes服務(wù)端集群
在啟動(dòng)及運(yùn)行過(guò)程中,會(huì)從
Apollo配置中心
讀取其關(guān)心的配置信息(如:業(yè)務(wù)應(yīng)用列表、熱點(diǎn)閾值配置、etcd地址…)穩(wěn)定性TMC本地緩存穩(wěn)定性表現(xiàn)在以下方面:數(shù)據(jù)上報(bào)異步化:Hermes-SDK
使用
rsyslog技術(shù)對(duì)“key訪問(wèn)事件”進(jìn)行異步化上報(bào),不會(huì)阻塞業(yè)務(wù);通信模塊線程隔離:Hermes-SDK
的通信模塊使用獨(dú)立線程池+有界隊(duì)列,保證事件上報(bào)&監(jiān)聽(tīng)的I/O操作與業(yè)務(wù)執(zhí)行線程隔離,即使出現(xiàn)非預(yù)期性異常也不會(huì)影響基本業(yè)務(wù)功能;緩存管控:Hermes-SDK
的熱點(diǎn)模塊對(duì)本地緩存大小上限進(jìn)行了管控,使其占用內(nèi)存不超過(guò)64MB(LRU),杜絕JVM堆內(nèi)存溢出的可能;一致性TMC本地緩存一致性表現(xiàn)在以下方面:Hermes-SDK
的熱點(diǎn)模塊僅緩存
熱點(diǎn)key
數(shù)據(jù),絕大多數(shù)非熱點(diǎn)key數(shù)據(jù)由
緩存集群
存儲(chǔ);熱點(diǎn)key
變更導(dǎo)致value失效時(shí),Hermes-SDK
同步失效本地緩存,保證
本地強(qiáng)一致;熱點(diǎn)key
變更導(dǎo)致value失效時(shí),Hermes-SDK
通過(guò)
etcd集群
廣播事件,異步失效業(yè)務(wù)應(yīng)用集群中其他節(jié)點(diǎn)的本地緩存,保證
集群最終一致;熱點(diǎn)發(fā)現(xiàn)整體流程TMC熱點(diǎn)發(fā)現(xiàn)流程分為四步:數(shù)據(jù)收集:收集
Hermes-SDK
上報(bào)的key訪問(wèn)事件;熱度滑窗:對(duì)App的每個(gè)Key,維護(hù)一個(gè)時(shí)間輪,記錄基于當(dāng)前時(shí)刻滑窗的訪問(wèn)熱度;熱度匯聚:對(duì)App的所有Key,以
的形式進(jìn)行熱度排序匯總;熱點(diǎn)探測(cè):對(duì)App,從熱Key排序匯總結(jié)果中選出TopN的熱點(diǎn)Key,推送給
Hermes-SDK;數(shù)據(jù)收集Hermes-SDK通過(guò)本地
rsyslog將
key訪問(wèn)事件以協(xié)議格式放入
kafka,Hermes服務(wù)端集群的每個(gè)節(jié)點(diǎn)消費(fèi)kafka消息,實(shí)時(shí)獲取
key訪問(wèn)事件。訪問(wèn)事件協(xié)議格式如下:appName:集群節(jié)點(diǎn)所屬業(yè)務(wù)應(yīng)用uniqueKey:業(yè)務(wù)應(yīng)用key訪問(wèn)事件的keysendTime:業(yè)務(wù)應(yīng)用key訪問(wèn)事件的發(fā)生時(shí)間weight:業(yè)務(wù)應(yīng)用key訪問(wèn)事件的訪問(wèn)權(quán)值Hermes服務(wù)端集群節(jié)點(diǎn)將收集到的
key訪問(wèn)事件存儲(chǔ)在本地內(nèi)存中,內(nèi)存數(shù)據(jù)結(jié)構(gòu)為
Map<string,map<string,longadderstyle="margin:0px;padding:0px;max-width:100%;box-sizing:border-box!important;word-wrap:break-word!important;">>,對(duì)應(yīng)業(yè)務(wù)含義映射為
Map<appname,map<uniquekey,熱度style="margin:0px;padding:0px;max-width:100%;box-sizing:border-box!important;word-wrap:break-word!important;">>。熱度滑窗時(shí)間滑窗Hermes服務(wù)端集群節(jié)點(diǎn),對(duì)每個(gè)App的每個(gè)key,維護(hù)了一個(gè)
時(shí)間輪:時(shí)間輪中共10個(gè)
時(shí)間片,每個(gè)時(shí)間片記錄當(dāng)前key對(duì)應(yīng)3秒時(shí)間周期的總訪問(wèn)次數(shù);時(shí)間輪10個(gè)時(shí)間片的記錄累加即表示當(dāng)前key從當(dāng)前時(shí)間向前30秒時(shí)間窗口內(nèi)的總訪問(wèn)次數(shù);映射任務(wù)Hermes服務(wù)端集群節(jié)點(diǎn),對(duì)每個(gè)App每3秒生成一個(gè)
映射任務(wù),交由節(jié)點(diǎn)內(nèi)“緩存映射線程池”執(zhí)行。映射任務(wù)內(nèi)容如下:對(duì)當(dāng)前App,從
Map<appname,map><appname,map<=""code="">中取出appName對(duì)應(yīng)的Map
Map<uniquekey,熱度style="margin:0px;padding:0px;max-width:100%;box-sizing:border-box!important;word-wrap:break-word!important;">>;遍歷
Map<uniquekey,熱度style="margin:0px;padding:0px;max-width:100%;box-sizing:border-box!important;word-wrap:break-word!important;">>中的key,對(duì)每個(gè)key取出其熱度存入其
時(shí)間輪
對(duì)應(yīng)的時(shí)間片中;熱度匯聚完成第二步“熱度滑窗”后,映射任務(wù)繼續(xù)對(duì)當(dāng)前App進(jìn)行“熱度匯聚”工作:遍歷App的key,將每個(gè)key的
時(shí)間輪
熱度進(jìn)行匯總(即30秒時(shí)間窗口內(nèi)總熱度)得到探測(cè)時(shí)刻
滑窗總熱度;將
<key,滑窗總熱度>
以排序集合的方式存入Redis存儲(chǔ)服務(wù)中,即
熱度匯聚結(jié)果;熱點(diǎn)探測(cè)在前幾步,每3秒
一次的
映射任務(wù)
執(zhí)行,對(duì)每個(gè)App都會(huì)產(chǎn)生一份當(dāng)前時(shí)刻的
熱度匯聚結(jié)果Hermes服務(wù)端集群
中的“熱點(diǎn)探測(cè)”節(jié)點(diǎn),對(duì)每個(gè)App,只需周期性從其最近一份
熱度匯聚結(jié)果
中取出達(dá)到熱度閾值的TopN的key列表,即可得到本次探測(cè)的
熱點(diǎn)key列表;TMC熱點(diǎn)發(fā)現(xiàn)整體流程如下圖:特性總結(jié)實(shí)時(shí)性Hermes-SDK
基于rsyslog+kafka實(shí)時(shí)上報(bào)
key訪問(wèn)事件。映射任務(wù)3秒一個(gè)周期完成“熱度滑窗”+“熱度匯聚”工作,當(dāng)有
熱點(diǎn)訪問(wèn)場(chǎng)景出現(xiàn)時(shí)最長(zhǎng)3秒即可探測(cè)出對(duì)應(yīng)
熱點(diǎn)key。準(zhǔn)確性key的熱度匯聚結(jié)果由“基于時(shí)間輪實(shí)現(xiàn)的滑動(dòng)窗口”匯聚得到,相對(duì)準(zhǔn)確地反應(yīng)當(dāng)前及最近正在發(fā)生訪問(wèn)分布。擴(kuò)展性Hermes服務(wù)端集群節(jié)點(diǎn)無(wú)狀態(tài),節(jié)點(diǎn)數(shù)可基于kafka的partition數(shù)量橫向擴(kuò)展?!盁岫然啊?“熱度匯聚”過(guò)程基于App數(shù)量,在單節(jié)點(diǎn)內(nèi)多線程擴(kuò)展。實(shí)戰(zhàn)效果快手商家某次商品營(yíng)銷(xiāo)活動(dòng)有贊商家通過(guò)快手直播平臺(tái)為某商品搞活動(dòng),造成該商品短時(shí)間內(nèi)被集中訪問(wèn)產(chǎn)生訪問(wèn)熱點(diǎn),活動(dòng)期間TMC記錄的實(shí)際熱點(diǎn)訪問(wèn)效果數(shù)據(jù)如下:某核心應(yīng)用的緩存請(qǐng)求&命中率曲線圖**上圖藍(lán)線為應(yīng)用集群調(diào)用get()方法訪問(wèn)緩存次數(shù)上圖綠線為獲取緩存操作命中TMC本地緩存的次數(shù)上圖為本地緩存命中率曲線圖可以看出活動(dòng)期間緩存請(qǐng)求量及本地緩存命中量均有明顯增長(zhǎng),本地緩存命中率達(dá)到近80%(即應(yīng)用集群中80%的緩存查詢(xún)請(qǐng)求被TMC本地緩存攔截)。熱點(diǎn)緩存對(duì)應(yīng)用訪問(wèn)的加速效果**上圖為應(yīng)用接
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 3-Pyrimidin-2-yl-2-pyrimidin-2-ylmethyl-propionic-acid-生命科學(xué)試劑-MCE
- 監(jiān)理兼職合同范本
- 保險(xiǎn)合同變更申請(qǐng)書(shū)
- 正規(guī)打工合同范本
- 磚廠清包工合同范本
- 2025年三維編織型材織物合作協(xié)議書(shū)
- 2025年畜禽肉、油脂及食用雜碎項(xiàng)目發(fā)展計(jì)劃
- 課程評(píng)估與改進(jìn)協(xié)議書(shū)(2篇)
- 2025年環(huán)保節(jié)能型冷卻塔項(xiàng)目合作計(jì)劃書(shū)
- 節(jié)能監(jiān)察報(bào)告范文
- 二十四節(jié)氣文化融入幼兒園食育的有效途徑
- 統(tǒng)計(jì)過(guò)程控制SPC培訓(xùn)資料
- 回字格+米字格練字模版(A4最大利用率)
- 食品經(jīng)營(yíng)操作流程圖
- 小學(xué)生必背古詩(shī)詞80首硬筆書(shū)法字帖
- 幼小銜接--相鄰數(shù)PPT課件
- 中風(fēng)(腦梗死恢復(fù)期)中醫(yī)護(hù)理方案(課堂PPT)
- X52K銑床參數(shù)
- 橡膠履帶力學(xué)分析及優(yōu)化設(shè)計(jì)
- CFM56-7發(fā)動(dòng)機(jī)滑油系統(tǒng)及其常見(jiàn)故障分析(共41頁(yè))
- 雙鋼板組合剪力墻工法
評(píng)論
0/150
提交評(píng)論