<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>

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

          共 2760字,需瀏覽 6分鐘

           ·

          2020-08-17 20:24

          △Hollis, 一個(gè)對(duì)Coding有著獨(dú)特追求的人△
          這是Hollis的第?300?篇原創(chuàng)分享
          作者 l Hollis
          來(lái)源 l Hollis(ID:hollischuang)
          對(duì)于大型的分布式系統(tǒng)來(lái)說(shuō),熱點(diǎn)數(shù)據(jù)一直都是一個(gè)需要重點(diǎn)關(guān)注的事情,比如熱賣商品、熱點(diǎn)新聞等就都是屬于熱點(diǎn)數(shù)據(jù)的。

          通常情況下,這種熱點(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)題。




          如何發(fā)現(xiàn)熱點(diǎn)數(shù)據(jù)

          一般情況下,我們是可以通過(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)題

          解決熱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)流量。




          京東的熱key探測(cè)

          前面簡(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ī)接口、用戶維度限流限流
          • 集群用戶維度限流
          • 集群接口維度限流
          在官方文檔中,大概介紹了一下這個(gè)框架的工作原理,這個(gè)框架主要由四個(gè)主要部分,分別是ETCD集群、worker集群、client客戶端以及dashboard控制臺(tái)。
          下圖介紹了一下各個(gè)部分的主要功能及簡(jiǎn)單原理:
          ?
          這個(gè)框架的使用還是相對(duì)簡(jiǎn)單的,主要分為以下幾個(gè)步驟:
          • 搭建etcd集群
          • 啟動(dòng)dashboard可視化界面
          • 啟動(dòng)worker集群
          • client啟動(dòng)
          詳情見(jiàn) https://gitee.com/jd-platform-opensource/hotkey 中的安裝教程部分,這里就不詳細(xì)介紹了。
          近日,這個(gè)框架在618穩(wěn)定版0.2版基礎(chǔ)上,引入了proto序列化方式,并優(yōu)化了傳輸對(duì)象。
          worker單機(jī)性能從618大促穩(wěn)定版的20萬(wàn)QPS穩(wěn)定,30萬(wàn)極限,提升至30萬(wàn)穩(wěn)定,37萬(wàn)極限。且cpu峰值下降了15%。
          該中間件目前在京東內(nèi)部10余個(gè)核心部門接入使用,服務(wù)于京東App服務(wù)端前臺(tái)、中臺(tái),數(shù)據(jù)中臺(tái)等多個(gè)核心業(yè)務(wù)線。
          最后,目前關(guān)于熱key的探測(cè)方面,京東做的還是不錯(cuò)的,至少他們開(kāi)源了一個(gè)工具出來(lái),給大家多了一個(gè)選擇。致敬開(kāi)源,給京東的開(kāi)源精神點(diǎn)個(gè)贊!



          往期推薦

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


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


          沒(méi)想到,我都來(lái)阿里5年了!


          本文由“壹伴編輯器”提供技術(shù)支
          ?

          直面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ì)我最大的支持。


          點(diǎn)個(gè)?在看?
          喜歡是一種感覺(jué)
          在看是一種支持
          ↘↘↘
          瀏覽 37
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  日本zaixian三区 | 美女裸身18禁 | 免费看日本黄色一级片 | 一本道无码在线播放 | 91视频啊啊啊 |