1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一個牛逼的 多級緩存 實現(xiàn)方案!

        共 6278字,需瀏覽 13分鐘

         ·

        2021-04-06 22:06

        來源:https://tech.youzan.com

        • 為什么要做 TMC

          • 多級緩存解決方案的痛點

        • TMC 整體架構(gòu)

        • TMC 本地緩存

          • 如何透明

          • 整體結(jié)構(gòu)

        • 熱點發(fā)現(xiàn)

          • 整體流程

          • 數(shù)據(jù)收集

          • 熱度滑窗

          • 熱度匯聚

          • 熱點探測

          • 特性總結(jié)

        • 實戰(zhàn)效果

          • 快手商家某次商品營銷活動

          • 雙十一期間部分應(yīng)用 TMC 效果展示**

        • 功能展望


        TMC,即“透明多級緩存(Transparent Multilevel Cache)”,是有贊 PaaS 團(tuán)隊給公司內(nèi)應(yīng)用提供的整體緩存解決方案。

        TMC 在通用“分布式緩存解決方案(如 CodisProxy + Redis,如有贊自研分布式緩存系統(tǒng) zanKV)”基礎(chǔ)上,增加了以下功能:

        • 應(yīng)用層熱點探測

        • 應(yīng)用層本地緩存

        • 應(yīng)用層緩存命中統(tǒng)計

        以幫助應(yīng)用層解決緩存使用過程中出現(xiàn)的熱點訪問問題。

        為什么要做 TMC

        使用有贊服務(wù)的電商商家數(shù)量和類型很多,商家會不定期做一些“商品秒殺”、“商品推廣”活動,導(dǎo)致“營銷活動”、“商品詳情”、“交易下單”等鏈路應(yīng)用出現(xiàn)緩存熱點訪問的情況:

        • 活動時間、活動類型、活動商品之類的信息不可預(yù)期,導(dǎo)致 緩存熱點訪問 情況不可提前預(yù)知;


        • 緩存熱點訪問 出現(xiàn)期間,應(yīng)用層少數(shù) 熱點訪問 key 產(chǎn)生大量緩存訪問請求:沖擊分布式緩存系統(tǒng),大量占據(jù)內(nèi)網(wǎng)帶寬,最終影響應(yīng)用層系統(tǒng)穩(wěn)定性;

        為了應(yīng)對以上問題,需要一個能夠 自動發(fā)現(xiàn)熱點 并 將熱點緩存訪問請求前置在應(yīng)用層本地緩存的解決方案,這就是 TMC 產(chǎn)生的原因。

        多級緩存解決方案的痛點

        基于上述描述,我們總結(jié)了下列 多級緩存解決方案需要解決的需求痛點:

        • 熱點探測:如何快速且準(zhǔn)確的發(fā)現(xiàn) 熱點訪問 key ?


        • 數(shù)據(jù)一致性:前置在應(yīng)用層的本地緩存,如何保障與分布式緩存系統(tǒng)的數(shù)據(jù)一致性?


        • 效果驗證:如何讓應(yīng)用層查看本地緩存命中率、熱點 key 等數(shù)據(jù),驗證多級緩存效果?


        • 透明接入:整體解決方案如何減少對應(yīng)用系統(tǒng)的入侵,做到快速平滑接入?

        TMC 聚焦上述痛點,設(shè)計并實現(xiàn)了整體解決方案。以支持“熱點探測”和“本地緩存”,減少熱點訪問時對下游分布式緩存服務(wù)的沖擊,避免影響應(yīng)用服務(wù)的性能及穩(wěn)定性。

        TMC 整體架構(gòu)

        TMC 整體架構(gòu)如上圖,共分為三層:

        • 存儲層:提供基礎(chǔ)的 kv 數(shù)據(jù)存儲能力,針對不同的業(yè)務(wù)場景選用不同的存儲服務(wù)(codis/zankv/aerospike);


        • 代理層:為應(yīng)用層提供統(tǒng)一的緩存使用入口及通信協(xié)議,承擔(dān)分布式數(shù)據(jù)水平切分后的路由功能轉(zhuǎn)發(fā)工作;


        • 應(yīng)用層:提供統(tǒng)一客戶端給應(yīng)用服務(wù)使用,內(nèi)置“熱點探測”、“本地緩存”等功能,對業(yè)務(wù)透明;

        本篇聚焦在應(yīng)用層客戶端的“熱點探測”、“本地緩存”功能。

        TMC 本地緩存

        如何透明

        TMC 是如何減少對業(yè)務(wù)應(yīng)用系統(tǒng)的入侵,做到透明接入的?對于公司 Java 應(yīng)用服務(wù),在緩存客戶端使用方式上分為兩類:

        • 基于 spring.data.redis包,使用 RedisTemplate編寫業(yè)務(wù)代碼;


        • 基于 youzan.framework.redis包,使用 RedisClient編寫業(yè)務(wù)代碼;

        不論使用以上那種方式,最終通過 JedisPool創(chuàng)建的 Jedis對象與緩存服務(wù)端代理層做請求交互。

        TMC 對原生 jedis 包的 JedisPool和 Jedis類做了改造,在 JedisPool 初始化過程中集成 TMC“熱點發(fā)現(xiàn)”+“本地緩存”功能 Hermes-SDK包的初始化邏輯

        使 Jedis客戶端與緩存服務(wù)端代理層交互時先與 Hermes-SDK交互,從而完成 “熱點探測”+“本地緩存”功能的透明接入。

        對于 Java 應(yīng)用服務(wù),只需使用特定版本的 jedis-jar 包,無需修改代碼,即可接入 TMC 使用“熱點發(fā)現(xiàn)”+“本地緩存”功能,做到了對應(yīng)用系統(tǒng)的最小入侵。

        整體結(jié)構(gòu)

        模塊劃分

        TMC 本地緩存整體結(jié)構(gòu)分為如下模塊:

        • Jedis-Client:Java 應(yīng)用與緩存服務(wù)端交互的直接入口,接口定義與原生 Jedis-Client 無異;


        • Hermes-SDK:自研“熱點發(fā)現(xiàn)+本地緩存”功能的 SDK 封裝,Jedis-Client 通過與它交互來集成相應(yīng)能力;


        • Hermes 服務(wù)端集群:接收 Hermes-SDK 上報的緩存訪問數(shù)據(jù),進(jìn)行熱點探測,將熱點 key 推送給 Hermes-SDK 做本地緩存;


        • 緩存集群:由代理層和存儲層組成,為應(yīng)用客戶端提供統(tǒng)一的分布式緩存服務(wù)入口;


        • 基礎(chǔ)組件:etcd 集群、Apollo 配置中心,為 TMC 提供“集群推送”和“統(tǒng)一配置”能力;

        基本流程

        1)key 值獲取

        • Java 應(yīng)用調(diào)用 Jedis-Client 接口獲取 key 的緩存值時,Jedis-Client 會詢問 Hermes-SDK 該 key 當(dāng)前是否是 熱點key


        • 對于 熱點key ,直接從 Hermes-SDK 的 熱點模塊 獲取熱點 key 在本地緩存的 value 值,不去訪問 緩存集群 ,從而將訪問請求前置在應(yīng)用層;


        • 對于非 熱點key ,Hermes-SDK 會通過 Callable回調(diào) Jedis-Client 的原生接口,從 緩存集群 拿到 value 值;


        • 對于 Jedis-Client 的每次 key 值訪問請求,Hermes-SDK 都會通過其 通信模塊 將 key 訪問事件 異步上報給 Hermes 服務(wù)端集群 ,以便其根據(jù)上報數(shù)據(jù)進(jìn)行“熱點探測”;


        2)key 值過期

        • Java 應(yīng)用調(diào)用 Jedis-Client 的 set() del() expire()接口時會導(dǎo)致對應(yīng) key 值失效,Jedis-Client 會同步調(diào)用 Hermes-SDK 的 invalid()方法告知其“key 值失效”事件;


        • 對于 熱點 key ,Hermes-SDK 的 熱點模塊 會先將 key 在本地緩存的 value 值失效,以達(dá)到本地數(shù)據(jù)強(qiáng)一致。同時 通信模塊 會異步將“key 值失效”事件通過 etcd 集群 推送給 Java 應(yīng)用集群中其他 Hermes-SDK 節(jié)點;


        • 其他 Hermes-SDK 節(jié)點的 通信模塊 收到 “key 值失效”事件后,會調(diào)用 熱點模塊 將 key 在本地緩存的 value 值失效,以達(dá)到集群數(shù)據(jù)最終一致;

        3)熱點發(fā)現(xiàn)

        • Hermes 服務(wù)端集群 不斷收集 Hermes-SDK上報的 key 訪問事件,對不同業(yè)務(wù)應(yīng)用集群的緩存訪問數(shù)據(jù)進(jìn)行周期性(3s 一次)分析計算,以探測業(yè)務(wù)應(yīng)用集群中的熱點 key列表;


        • 對于探測到的熱點 key列表,Hermes 服務(wù)端集群 將其通過 etcd 集群 推送給不同業(yè)務(wù)應(yīng)用集群的 Hermes-SDK 通信模塊,通知其對熱點 key列表進(jìn)行本地緩存;


        4)配置讀取

        • Hermes-SDK 在啟動及運(yùn)行過程中,會從 Apollo 配置中心 讀取其關(guān)心的配置信息(如:啟動關(guān)閉配置、黑白名單配置、etcd 地址…);


        • Hermes 服務(wù)端集群 在啟動及運(yùn)行過程中,會從 Apollo 配置中心 讀取其關(guān)心的配置信息(如:業(yè)務(wù)應(yīng)用列表、熱點閾值配置、etcd 地址…)

        穩(wěn)定性

        TMC 本地緩存穩(wěn)定性表現(xiàn)在以下方面:

        • 數(shù)據(jù)上報異步化:Hermes-SDK 使用 rsyslog技術(shù)對“key 訪問事件”進(jìn)行異步化上報,不會阻塞業(yè)務(wù);


        • 通信模塊線程隔離:Hermes-SDK 的 通信模塊 使用獨(dú)立線程池+有界隊列,保證事件上報&監(jiān)聽的 I/O 操作與業(yè)務(wù)執(zhí)行線程隔離,即使出現(xiàn)非預(yù)期性異常也不會影響基本業(yè)務(wù)功能;


        • 緩存管控:Hermes-SDK 的 熱點模塊 對本地緩存大小上限進(jìn)行了管控,使其占用內(nèi)存不超過 64MB(LRU),杜絕 JVM 堆內(nèi)存溢出的可能;

        一致性

        TMC 本地緩存一致性表現(xiàn)在以下方面:

        • Hermes-SDK 的 熱點模塊 僅緩存 熱點 key 數(shù)據(jù),絕大多數(shù)非熱點 key數(shù)據(jù)由 緩存集群 存儲;


        • 熱點 key 變更導(dǎo)致 value 失效時,Hermes-SDK 同步失效本地緩存,保證 本地強(qiáng)一致;


        • 熱點 key 變更導(dǎo)致 value 失效時,Hermes-SDK 通過 etcd 集群 廣播事件,異步失效業(yè)務(wù)應(yīng)用集群中其他節(jié)點的本地緩存,保證 集群最終一致;

        熱點發(fā)現(xiàn)

        整體流程

        TMC 熱點發(fā)現(xiàn)流程分為四步:

        • 數(shù)據(jù)收集:收集 Hermes-SDK 上報的 key 訪問事件;


        • 熱度滑窗:對 App 的每個 Key,維護(hù)一個時間輪,記錄基于當(dāng)前時刻滑窗的訪問熱度;


        • 熱度匯聚:對 App 的所有 Key,以 的形式進(jìn)行 熱度排序匯總;


        • 熱點探測:對 App,從 熱 Key 排序匯總 結(jié)果中選出 TopN 的熱點 Key ,推送給 Hermes-SDK

        數(shù)據(jù)收集

        Hermes-SDK通過本地 rsyslog將 key 訪問事件以協(xié)議格式放入 kafka,Hermes 服務(wù)端集群的每個節(jié)點消費(fèi) kafka 消息,實時獲取 key 訪問事件。

        訪問事件協(xié)議格式如下:

        • appName:集群節(jié)點所屬業(yè)務(wù)應(yīng)用

        • uniqueKey:業(yè)務(wù)應(yīng)用 key 訪問事件 的 key

        • sendTime:業(yè)務(wù)應(yīng)用 key 訪問事件 的發(fā)生時間

        • weight:業(yè)務(wù)應(yīng)用 key 訪問事件 的訪問權(quán)值

        Hermes 服務(wù)端集群節(jié)點將收集到的 key 訪問事件存儲在本地內(nèi)存中,內(nèi)存數(shù)據(jù)結(jié)構(gòu)為 Map<string,map>,對應(yīng)業(yè)務(wù)含義映射為 Map<appname,map>

        熱度滑窗

        時間滑窗

        Hermes 服務(wù)端集群節(jié)點,對每個 App 的每個 key,維護(hù)了一個 時間輪

        • 時間輪中共 10 個 時間片,每個時間片記錄當(dāng)前 key 對應(yīng) 3 秒時間周期的總訪問次數(shù);


        • 時間輪 10 個時間片的記錄累加即表示當(dāng)前 key 從當(dāng)前時間向前 30 秒時間窗口內(nèi)的總訪問次數(shù);

        映射任務(wù)

        Hermes 服務(wù)端集群節(jié)點,對每個 App 每 3 秒 生成一個 映射任務(wù),交由節(jié)點內(nèi) “緩存映射線程池” 執(zhí)行。映射任務(wù)內(nèi)容如下:

        • 對當(dāng)前 App,從 Map<appname,map>< appname,map<="" code="">中取出 appName 對應(yīng)的 Map Map>;



        • 遍歷 Map>中的 key,對每個 key 取出其熱度存入其 時間輪 對應(yīng)的時間片中;

        熱度匯聚

        完成第二步“熱度滑窗”后,映射任務(wù)繼續(xù)對當(dāng)前 App 進(jìn)行“熱度匯聚”工作:

        • 遍歷 App 的 key,將每個 key 的 時間輪 熱度進(jìn)行匯總(即 30 秒時間窗口內(nèi)總熱度)得到探測時刻 滑窗總熱度;


        • 將 < key , 滑窗總熱度 > 以排序集合的方式存入 Redis 存儲服務(wù) 中,即 熱度匯聚結(jié)果

        熱點探測

        • 在前幾步,每 3 秒 一次的 映射任務(wù) 執(zhí)行,對每個 App 都會產(chǎn)生一份當(dāng)前時刻的 熱度匯聚結(jié)果


        • Hermes 服務(wù)端集群 中的“熱點探測”節(jié)點,對每個 App,只需周期性從其最近一份 熱度匯聚結(jié)果 中取出達(dá)到熱度閾值的 TopN 的 key 列表,即可得到本次探測的 熱點 key 列表;

        TMC 熱點發(fā)現(xiàn)整體流程如下圖:

        特性總結(jié)

        實時性

        Hermes-SDK 基于rsyslog + kafka 實時上報 key 訪問事件。映射任務(wù)3 秒一個周期完成“熱度滑窗” + “熱度匯聚”工作,當(dāng)有 熱點訪問場景出現(xiàn)時最長 3 秒即可探測出對應(yīng) 熱點 key。

        準(zhǔn)確性

        key 的熱度匯聚結(jié)果由“基于時間輪實現(xiàn)的滑動窗口”匯聚得到,相對準(zhǔn)確地反應(yīng)當(dāng)前及最近正在發(fā)生訪問分布。

        擴(kuò)展性

        Hermes 服務(wù)端集群節(jié)點無狀態(tài),節(jié)點數(shù)可基于 kafka 的 partition 數(shù)量橫向擴(kuò)展。

        “熱度滑窗” + “熱度匯聚” 過程基于 App 數(shù)量,在單節(jié)點內(nèi)多線程擴(kuò)展。

        實戰(zhàn)效果

        快手商家某次商品營銷活動

        有贊商家通過快手直播平臺為某商品搞活動,造成該商品短時間內(nèi)被集中訪問產(chǎn)生訪問熱點,活動期間 TMC 記錄的實際熱點訪問效果數(shù)據(jù)如下:

        某核心應(yīng)用的緩存請求&命中率曲線圖**

        • 上圖藍(lán)線為應(yīng)用集群調(diào)用get()方法訪問緩存次數(shù)

        • 上圖綠線為獲取緩存操作命中TMC本地緩存的次數(shù)

        • 上圖為本地緩存命中率曲線圖

        可以看出活動期間緩存請求量及本地緩存命中量均有明顯增長,本地緩存命中率達(dá)到近 80%(即應(yīng)用集群中 80% 的緩存查詢請求被 TMC 本地緩存攔截)。

        熱點緩存對應(yīng)用訪問的加速效果**

        • 上圖為應(yīng)用接口 QPS 曲線

        • 上圖為應(yīng)用接口 RT 曲線

        可以看出活動期間應(yīng)用接口的請求量有明顯增長,由于 TMC 本地緩存的效果應(yīng)用接口的 RT 反而出現(xiàn)下降。

        雙十一期間部分應(yīng)用 TMC 效果展示**

        商品域核心應(yīng)用效果

        活動域核心應(yīng)用效果

        功能展望

        TMC 目前已為商品中心、物流中心、庫存中心、營銷活動、用戶中心、網(wǎng)關(guān)&消息等多個核心應(yīng)用模塊提供服務(wù),后續(xù)應(yīng)用也在陸續(xù)接入中。

        TMC 在提供“熱點探測” + “本地緩存”的核心能力同時,也為應(yīng)用服務(wù)提供了靈活的配置選擇,應(yīng)用服務(wù)可以結(jié)合實際業(yè)務(wù)情況在“熱點閾值”、“熱點 key 探測數(shù)量”、“熱點黑白名單”維度進(jìn)行自由配置以達(dá)到更好的使用效果。

        END


        順便給大家推薦一個GitHub項目,這個 GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,

        GitHub地址:https://github.com/javadevbooks/books

        Gitee地址:https://gitee.com/javadevbooks/books

        電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點一個star,持續(xù)更新中..


        瀏覽 18
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            狠狠干狠狠干 | 天天干天天色 | A级毛片高清不卡视频免费观看 | 大香蕉视频更新资源 | 亚洲精品网站日本xxxxxxx | 亚洲永久免费精品 | 欧美四区 | 淫荡人妻视频 | 偷拍91| 琪琪色原影音先锋 |