導航:首頁 > 源碼編譯 > 京東04年網站源碼

京東04年網站源碼

發布時間:2023-06-06 06:07:09

Ⅰ 京東hotkey源碼解析

京東hotkey是一個經過京東大促驗證的hotkey防禦中間件,大概原理是通過上報key訪問數到統計伺服器集群,統計伺服器集群將hotkey通知到客戶端,讓hotkey能緩存到本地內存中,做到毫秒級的Scale-Out。處理方式有點像美團cat實時收集數據進行統計,只不過美團cat沒有反向通知邏輯而已。非常貼近工作實踐,值得一看。

首先看一下緩存入口Cache的get方法,JdHotKeyStore.getValue是獲取hotkey的方法,並且會進行訪問次數的統計上報,如果獲取到hotkey不為空,則直接返回,否則從redis獲取並調用JdHotKeyStore.smartSet判斷是否有hotkey,有則設置值,最後返回。

JdHotKeyStore.getValue會先調用inRule校驗此key是否有對應規則,如果沒有對應規則則不處理,然後調用getValueSimple從本地內存中獲取hotkey的存儲對象ValueModel,如果沒有獲取到,則調用HotKeyPusher.push開始計數;如果獲取到,會調用isNearExpire判斷是否快過期了,如果是也計數,然後取出ValueModel里的value是否有設置對應值,有才返回。最後調用KeyHandlerFactory.getCounter().collect進行對應規則的計數。下面來一步步分析此流程。

inRule會去KeyRule緩存中獲取對應的規則,經過層層調用會到KeyRuleHolder的findByKey方法,然後繼續調用其findRule方法選擇對應的KeyRule,如果沒有KeyRule就直接返回了,否則會拿到它的ration(hotkey緩存時間),拿到對應ration的本地緩存。實際上這里為了方法的通用性,用了get來代替contain的判斷。

findRule的邏輯比較特別,作者已經留下了注釋,優先全匹配->prefix匹配-> * 通配,這樣做是為了更精確選擇對應的規則。比如配置了sku_的前綴規則,但是茅台sku的流量突升,需要針對茅台sku的本地緩存再長一點時間讓系統平穩渡過高峰期,那就配置一個sku_moutai_sku_id的全匹配規則,這樣不會干擾到其他sku的緩存規則。

那麼KEY_RULES的規則是怎麼來的呢?這就要說到etcd了,其實可以把etcd當做zookeeper,也有對配置crud,然後通知客戶端的功能。這里是做了定時拉取+監聽變化的雙重保證,這里跟攜程apollo的處理非常像:不要把雞蛋放在一個籃子,兜底功能真的很重要。每5秒定時從etcd拉取規則,開啟監聽器有變化就去etcd拉取規則。fetchRuleFromEtcd從ectd的rule_path獲取rules,然後轉化成ruleList繼續調用notifyRuleChange進行本地處理。

notifyRuleChange會往EventBus發送KeyRuleInfoChangeEvent的通知,進而進入KeyRuleHolder的putRules方法,這里可以看到維護了KEY_RULES和RULE_CACHE_MAP。

回到原有流程,getValueSimple方法的鏈路比較長,主要是通過key的規則,獲取到對應的ration,然後從對應ration的本地緩存中獲取ValueModel。

接下來是HotKeyPusher.push,如果是remove則在etcd創建一個節點然後再刪除,達到集群刪除的效果。如果是探測並且key在規則內,則調用KeyHandlerFactory.getCollector().collect進行統計。

KeyHandlerFactory.getCollector().collect方法交替使用兩個map,對count進行累加,這樣清理map的時候就不需要停頓了,交替使用是避免停頓的有效方式。

接回上文,還有一個 KeyHandlerFactory.getCounter().collect收集的是規則的訪問次數,也是取到對應的規則,然後對規則的訪問總數、熱次數進行累加。

兩個指標的收集已經分析完畢,那怎麼發送到worker呢?來到PushSchelerStarter,這里會啟動對兩個指標的定時線程池,分別會定時調用NettyKeyPusher的send和sendCount方法。

NettyKeyPusher的send和sendCount方法都是為統計數據選擇對應的worker然後進行請求,chooseChannel就是根據key哈希到其中一個worker上,然後發送請求即可。

最後當worker統計到hotkey時,client需要接收worker推送過來的hotkey進行存儲,可以看到NettyClientHandler會向EventBus發送ReceiveNewKeyEvent事件,ReceiveNewKeyListener收到此事件後將調用receiveNewKeyListener.newKey,將hotkey放到本地緩存,client端的處理流程就結束了。

由上文可知,client與worker的交互只有推送統計數據到worker,worker接收處理,最後推送hotkey到client。因此worker端只需要分析兩個部分:統計數據匯總、推送hotkey。
首先看到HotKey的處理邏輯是在HotKeyFilter中,首先會對totalReceiveKeyCount進行累加,然後調用publishMsg,如果統計信息超時1秒或者在白名單中就不處理,否則繼續調用keyProcer.push。

keyProcer.push將未過時的統計信息丟進queue中。

worker端會開啟指定數量的KeyConsumer,不斷消費queue中的統計數據。根據統計數據的類型調用KeyListener的removeKey和newKey。

KeyListener的removeKey和newKey方法對Cache中的滑動窗口SlidingWindow進行刪除或者累加,刪除或者達到一定訪問數就會推送到根據appname選出所有client進行推送。

京東的hotkey處理是通過計數來動態判斷是否為hotkey,然後緩存再本地內存中,做到毫秒級的scale out。那還有沒有其他解決方案?下面是我的觀點:
1.如果面對一些緩存key很少的場景,比如活動頁信息(同時進行的活動頁不可能超過1000),完全就可以直接將緩存放在本地內存中,到了刷新時間就從redis拉取最新緩存即可,不需要動態計算hotkey。也就是常見的多級緩存。
2.同樣是動態判斷hotkey,但會將hotkey遷移到專門的、更多節點、更高性能的hotkey redis集群中,集群中每個節點都有同一個hotkey緩存,這樣就可以做到請求的分散,避免流量都流向同一個redis節點,判斷是hotkey就去hotkey集群中取,不需要存在本地內存中了,維護起來會比較簡單。

Ⅱ 用京東網的源代碼,修改一下,做一個類似的商城網站要多少錢

套用一個差不多的簡陋模板 有熟人的話白送 買個的話 400
域名 一年60 空間一年450

Ⅲ 求一個仿京東首頁的靜態網頁,。。不用太繁瑣 用html寫 做3個html頁面(首頁/列表頁/詳情頁)

全部仿下來很累人,可以仿一部分,你可以直接把它的源代碼復制一份,然後刪掉一部分,調整一下js,直接下載到你本地調用比較好。

Ⅳ 如何用python抓取淘寶京東網頁所有審查元素,不是源代碼

審查元素顯示的其實就是格式化之後的源代碼,你可以用對比一下。

下面是一個Python3使用urllib庫讀取源代碼的例子,如果要處理成審查元素那樣的格式,需要對html標簽逐個處理下

importhttp.cookiejar
importurllib.request
ckjar=http.cookiejar.MozillaCookieJar()
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(ckjar))
res=opener.open("http://jd.com")
htm=res.read().decode('gbk')
print(htm)

java使用httpclient實現京東自動登錄,登錄頁面的解析action

應該是js提交的

閱讀全文

與京東04年網站源碼相關的資料

熱點內容
為什麼要搭建單獨伺服器 瀏覽:478
編譯器有什麼控制 瀏覽:891
希爾伯特pdf 瀏覽:645
php數組全數字 瀏覽:645
解密塔羅牌小程序源碼 瀏覽:862
聚合跑分源碼 瀏覽:553
注冊dns伺服器寫什麼 瀏覽:879
linux安裝deb包 瀏覽:521
電腦盤文件夾如何平鋪 瀏覽:267
相機卡滿了沒文件夾 瀏覽:751
如何批量快速壓縮視頻 瀏覽:432
我的世界如何加入ice伺服器 瀏覽:873
兄弟cnc編程說明書 瀏覽:204
php閃電入門教程學習 瀏覽:152
金岳霖邏輯pdf 瀏覽:938
linuxtomcat線程 瀏覽:77
pboc長度加數據加密 瀏覽:187
英雄聯盟國際服手游怎麼下安卓 瀏覽:298
程序員的思路 瀏覽:234
只能用命令獲得的四種方塊 瀏覽:358