一、為什么需要熱點緩存探測
? ? ? ? 在回答這個問題前,我們先考慮一下:為什么光用 Redis 還不夠,還需要使用本地緩存?
? ? ? ? 一般來說,Redis 集群的性能能抗住幾十萬并發,能夠應付大部分情況。但對于一些頭部 APP,當出現熱點輿情、商品秒殺活動等百萬并發的場景,Redis 集群也來不及處理這么多請求,更何況對某一個熱點 key 的請求會打到同一個 Redis 分片上。這會導致?Redis 服務超時甚至不可用,最終形成緩存雪崩。
????????如果能把熱點數據緩存到應用程序節點中,就可以解決問題,因為本地緩存有以下優勢:
1、數據不需要通過網絡傳輸,能提升性能
2、由于應用的高擴展性,本地緩存是天然的分布式存儲,負載分擔容易實現
3、本地緩存可以緩解遠程緩存的壓力
? ? ? ? 但是,使用本地緩存最重要的問題是:本地內存有限,無法支持大量數據存儲
????????因此在超高并發業務下,需要引入熱點緩存探測系統(以下簡稱“熱點系統”),它解決本地緩存問題的方法大致如下:
????????由于本地內存有限,所以最好是只存儲熱點數據,從而兼顧內存規模和緩存命中率。但是超高并發業務往往采用大量的應用節點,每個節點分擔到的流量有限,所以單個節點僅分析自身的數據使用情況,難以及時得知哪些是熱點 key。而熱點系統把各節點的數據使用情況進行收集、匯總,從全局判斷出哪些屬于熱點 key,再把熱點 key 推送給各應用節點。
二、熱點 key 的使用場景
? ? ? ? 熱點數據有兩個重要特性:有限時間、流量高聚。熱點 key 的使用場景主要有:
1、正面的:例如熱門商品的 id、熱點輿情的 id。這些 key 作為熱點 key 后,數據緩存到本地,商品詳情、輿情詳情等信息就不用再從 Redis 獲取了,減小了 Redis 壓力。
2、負面的:例如使用搶票腳本的 ip 地址。這些 key 作為熱點 key 后,數據緩存到本地,當請求到來后,直接從本地緩存看一下是否存在,若存在就拒絕這些請求。
? ? ? ? 當然,熱點系統只是把 key 當作一個字符串,具體在什么場景使用,非常靈活。
三、JDHotKey 架構剖析
(一)整體架構
JDHotKey 主要由 4 個組件構成:
1、etcd:etcd 是一個高性能的配置中心,可以以極小的資源占用,提供高效的監聽訂閱服務。主要用于存放規則配置,各 worker 的 ip 地址,以及探測出的熱 key、手工添加的熱 key 等。
2、client:client 是在應用中添加的引用 jar,引入后,就可以以便捷的方式去判斷某 key 是否熱key。同時,該 jar 完成了 key 上報、監聽 etcd 里的 rule 變化、worker 信息變化、熱 key 變化,對熱 key 進行本地 caffeine 緩存等。
3、worker:worker 端是一個獨立部署的 Java 程序,通常部署多臺根據 key 的 Hash 值進行流量分擔。worker 啟動后會連接 etcd,并定期上報自己的ip信息,供client端獲取地址并進行長連接。之后,對各個client發來的待測key進行累加計算,當達到etcd里設定的rule閾值后,將熱key推送到各個client。
4、dashboard:dashboard 是一個可視化控制臺,啟動后會連接 etcd,之后在控制臺設置各個 APP 的 key 規則。然后當worker探測出來熱key后,會將 key 發往 etcd,dashboard 也會監聽熱 key 信息,進行入庫保存記錄。同時,dashboard 也可以手工添加、刪除熱 key,供各個 client 端監聽。
(二)核心業務邏輯
1、規則維護:主要由運營人員通過 dashboard 配置熱點規則,比如:對于所有 product 開頭的 key,2秒內出現20次訪問算熱 key)。
2、熱點上報:client 端會根據熱點規則,將參與熱點統計的 key 進行本地統計,并定期(默認 500 ms 一次)上報給 worker。上報時,會對 key 進行 hash 運算后取余,找到對應的 worker 進行上報。
3、熱點統計:每個 worker 會負責自己管轄范圍內的 key 的統計,采用的是滑動窗口算法。
4、熱點推送:當 worker 熱點統計發現熱 key 時,將熱 key 推送給所有的 client。此外,dashboard 也可以手動添加或刪除熱 key 并進行推送。
5、熱點緩存:當 client 收到熱點推送后,會從本地的熱 key 集合中進行添加或刪除。開發人員可以通過 client 提供的 SDK 查詢某個 key 是否為熱 key,也可以通過 SDK?從本地緩存(Caffiene)中存入、獲取、刪除熱 key 對應的 value。
參考:https://mp.weixin.qq.com/s/xOzEj5HtCeh_ezHDPHw6Jw