<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 6453字,需瀏覽 13分鐘

           ·

          2021-03-29 06:58

          往期熱門文章:

          1、往期精選優(yōu)秀博文都在這里了!
          2、分庫分表?如何做到永不遷移數(shù)據(jù)和避免熱點?
          3、36 張圖梳理 Intellij IDEA 常用設(shè)置,寫代碼賊爽!
          4、2020年國內(nèi)互聯(lián)網(wǎng)公司的薪酬排名!
          5不要再封裝各種Util工具類了,這個神級框架值得擁有!

          來源: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 團隊給公司內(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é)了下列 多級緩存解決方案需要解決的需求痛點:

          • 熱點探測:如何快速且準確的發(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é)議,承擔分布式數(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ù),進行熱點探測,將熱點 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 當前是否是 熱點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ù)進行“熱點探測”;


          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 值失效,以達到本地數(shù)據(jù)強一致。同時 通信模塊 會異步將“key 值失效”事件通過 etcd 集群 推送給 Java 應(yīng)用集群中其他 Hermes-SDK 節(jié)點;


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

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

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


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


          4)配置讀取

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


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

          穩(wěn)定性

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

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


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


          • 緩存管控:Hermes-SDK 的 熱點模塊 對本地緩存大小上限進行了管控,使其占用內(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 同步失效本地緩存,保證 本地強一致


          • 熱點 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,維護一個時間輪,記錄基于當前時刻滑窗的訪問熱度;


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


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

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

          Hermes-SDK通過本地 rsyslog將 key 訪問事件以協(xié)議格式放入 kafkaHermes 服務(wù)端集群的每個節(jié)點消費 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,維護了一個 時間輪

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


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

          映射任務(wù)

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

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



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

          熱度匯聚

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

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


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

          熱點探測

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


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

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

          特性總結(jié)

          實時性

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

          準確性

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

          擴展性

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

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

          實戰(zhàn)效果

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

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

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

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

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

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

          可以看出活動期間緩存請求量及本地緩存命中量均有明顯增長,本地緩存命中率達到近 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ù)量”、“熱點黑白名單”維度進行自由配置以達到更好的使用效果。

          往期熱門文章:

          1、歷史文章分類導(dǎo)讀列表!精選優(yōu)秀博文都在這里了!》

          2阿里一面:如何保障消息100%投遞成功、消息冪等性?
          3、GitHub 熱榜:被網(wǎng)友瘋狂惡搞的「螞蟻呀嘿」項目終于開源了!
          4、記住!看小電影前一定要檢查一下域名是不是 HTTPS 的,不然....
          5、拿到年終獎后馬上辭職,厚道嗎?
          6、Redis 內(nèi)存滿了怎么辦?
          7、在 IDE 中玩轉(zhuǎn) GitHub
          8、死磕18個Java8日期處理,工作必用!
          9、把我坑慘的一個MySQL雙引號!
          10、2021年 我辭職了!

          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青娱乐精品盛宴 | 中国精品毛片 | 日韩无码第三页 | 欧美激情手机在线 | 大香蕉这里只有精品视频 |