京東熱 key 探測(cè)框架新版發(fā)布,單機(jī) QPS 可達(dá) 35 萬(wàn)


通常情況下,這種熱點(diǎn)數(shù)據(jù)都會(huì)被放在緩存里面,但是即使這樣,如果突然有大量流量需要訪問(wèn)同一個(gè)特定的數(shù)據(jù),就會(huì)導(dǎo)致流量過(guò)于集中,使得很多物理資源無(wú)法支撐,如網(wǎng)絡(luò)帶寬、物理存儲(chǔ)空間、數(shù)據(jù)庫(kù)連接等。
這也是為什么某某明星官宣之后,微博上面就會(huì)出現(xiàn)宕機(jī)的情況。有時(shí)候這種宕機(jī)發(fā)生后,其他功能都是可以使用的,只是和這個(gè)熱點(diǎn)有關(guān)的內(nèi)容會(huì)無(wú)法訪問(wèn),這其實(shí)就和熱點(diǎn)數(shù)據(jù)有關(guān)系了。
一般情況下,我們會(huì)把熱點(diǎn)數(shù)據(jù)緩存下來(lái),而緩存一般都需要有個(gè)固定的key,所以,很多時(shí)候我們也稱這類問(wèn)題為熱key問(wèn)題。
一般情況下,我們是可以通過(guò)一些手段來(lái)識(shí)別并發(fā)現(xiàn)熱key的,主要有以下幾種方式:
根據(jù)經(jīng)驗(yàn),提前預(yù)測(cè)
這種方法在大多數(shù)情況下還是比較奏效的。比較常見(jiàn)的就是電商系統(tǒng)中,會(huì)在做秒殺、搶購(gòu)等業(yè)務(wù)開(kāi)始前就能預(yù)測(cè)出熱key。
但是,這種方式的局限性也很大,就是有些熱key是完全沒(méi)辦法預(yù)測(cè)的,比如明星什么時(shí)候要官宣這種事情就無(wú)法預(yù)測(cè)。
實(shí)時(shí)收集
還有一種熱點(diǎn)數(shù)據(jù)的發(fā)現(xiàn)機(jī)制,那就是實(shí)時(shí)的做收集,比如在客戶端、服務(wù)端或者在代理層,都可以對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行采集,然后進(jìn)行統(tǒng)計(jì)匯總。
達(dá)到一定的數(shù)量之后,就會(huì)被識(shí)別為熱key
解決熱key問(wèn)題最主要的方式就是加緩存。通過(guò)緩存的方式盡量減少系統(tǒng)交互,使得用戶請(qǐng)求可以提前返回。
這樣即能提升用戶體驗(yàn),也能減少系統(tǒng)壓力。
緩存的方式有很多,有些數(shù)據(jù)可以緩存在客戶的客戶端瀏覽器中,有些數(shù)據(jù)可以緩存在距離用戶就近的DNS中,有些數(shù)據(jù)可以通過(guò)Redis等這類緩存框架進(jìn)行緩存,還有些數(shù)據(jù)可以通過(guò)服務(wù)器本地緩存進(jìn)行。
這種使用多個(gè)緩存的情況,就組成了二級(jí)緩存、三級(jí)緩存等多級(jí)緩存了。總之,通過(guò)緩存的方式盡量減少用戶的的訪問(wèn)鏈路的長(zhǎng)度。
有了緩存之后,還會(huì)帶來(lái)一個(gè)問(wèn)題,那就是熱點(diǎn)數(shù)據(jù)如果都被緩存在同一個(gè)緩存服務(wù)器上,那么這個(gè)服務(wù)器也可能被打掛。
所以,很多人在加了緩存之后, 還可能同時(shí)部署多個(gè)緩存服務(wù)器,如Redis同時(shí)部署多個(gè)服務(wù)器集群。并且實(shí)時(shí)的將熱點(diǎn)數(shù)據(jù)同步分發(fā)到多個(gè)緩存服務(wù)器集群中,一旦有的集群扛不住了,立刻做切換。
單純的對(duì)于Redis熱key緩存來(lái)說(shuō),Redis是有分片機(jī)制的,同一個(gè)熱key可能會(huì)都保存在同一個(gè)分片中,所以還可以在多個(gè)分片中都把熱key同步一份,使得查詢可以同時(shí)從多個(gè)分片進(jìn)行,減少某一個(gè)分片的壓力。
因?yàn)橛蟹制€有一種情況,就是有可能多個(gè)熱key都會(huì)分到同一個(gè)分片中,為了減少這種情況的發(fā)生,可以增加更多的分片來(lái)分擔(dān)流量。
前面簡(jiǎn)單介紹了熱key的發(fā)現(xiàn)與解決,這種問(wèn)題其實(shí)最明顯的發(fā)生就是在電商系統(tǒng)或者像微博這種社交系統(tǒng)中。
所以很多公司內(nèi)部也有很多成熟的方案。
今天想介紹一個(gè)京東內(nèi)部的框架——JD-hotkey ,這是京東 APP 后臺(tái)熱數(shù)據(jù)探測(cè)框架。
這個(gè)框架在Gitee上面開(kāi)源了(https://gitee.com/jd-platform-opensource/hotkey ),官方描述是這樣的:
對(duì)任意突發(fā)性的無(wú)法預(yù)先感知的熱點(diǎn)數(shù)據(jù),包括并不限于熱點(diǎn)數(shù)據(jù)(如突發(fā)大量請(qǐng)求同一個(gè)商品)、熱用戶(如惡意爬蟲(chóng)刷子)、熱接口(突發(fā)海量請(qǐng)求同一個(gè)接口)等,進(jìn)行毫秒級(jí)精準(zhǔn)探測(cè)到。 然后對(duì)這些熱數(shù)據(jù)、熱用戶等,推送到所有服務(wù)端JVM內(nèi)存中,以大幅減輕對(duì)后端數(shù)據(jù)存儲(chǔ)層的沖擊,并可以由使用者決定如何分配、使用這些熱key(譬如對(duì)熱商品做本地緩存、對(duì)熱用戶進(jìn)行拒絕訪問(wèn)、對(duì)熱接口進(jìn)行熔斷或返回默認(rèn)值)。
這些熱數(shù)據(jù)在整個(gè)服務(wù)端集群內(nèi)保持一致性,并且業(yè)務(wù)隔離,worker端性能強(qiáng)悍。
JD-hotkey探測(cè)框架,歷經(jīng)多次高壓壓測(cè)和2020年京東618大促考驗(yàn)。在上線運(yùn)行的這段時(shí)間內(nèi),每天探測(cè)的key數(shù)量數(shù)十億計(jì),精準(zhǔn)捕獲了大量爬蟲(chóng)、刷子用戶,另準(zhǔn)確探測(cè)大量熱門商品并毫秒級(jí)推送到各個(gè)服務(wù)端內(nèi)存,大幅降低了熱數(shù)據(jù)對(duì)數(shù)據(jù)層的查詢壓力,提升了應(yīng)用性能。
該框架歷經(jīng)多次壓測(cè),8核單機(jī)worker端每秒可接收處理16萬(wàn)個(gè)key探測(cè)任務(wù),16核單機(jī)至少每秒平穩(wěn)處理30萬(wàn)以上,實(shí)際壓測(cè)達(dá)到37萬(wàn),CPU平穩(wěn)支撐,框架無(wú)異常。
簡(jiǎn)單點(diǎn)說(shuō),這個(gè)框架的主要功能就是熱數(shù)據(jù)探測(cè)并推送至集群各個(gè)服務(wù)器。這個(gè)框架主要適用于以下場(chǎng)景:
mysql 熱數(shù)據(jù)本地緩存 redis 熱數(shù)據(jù)本地緩存 黑名單用戶本地緩存 爬蟲(chóng)用戶限流 接口、用戶維度限流 單機(jī)接口、用戶維度限流限流 集群用戶維度限流 集群接口維度限流

搭建etcd集群 啟動(dòng)dashboard可視化界面 啟動(dòng)worker集群 client啟動(dòng)
往期推薦

《Java開(kāi)發(fā)手冊(cè)》解讀:大整數(shù)傳輸為何禁用Long類型?

不要再自己封裝各種Util工具類了,這款神仙級(jí)框架你值得擁有!

沒(méi)想到,我都來(lái)阿里5年了!
直面Java第329期:哪個(gè)命令可以監(jiān)控虛擬機(jī)各種運(yùn)行狀態(tài)信息?
深入并發(fā)第013期:拓展synchronized——鎖優(yōu)化
如果你喜歡本文,
請(qǐng)長(zhǎng)按二維碼,關(guān)注?Hollis.
轉(zhuǎn)發(fā)至朋友圈,是對(duì)我最大的支持。
