中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

秒殺搶購(gòu)系統(tǒng)優(yōu)化思路詳解

2019-02-15    來(lái)源:SEO研究協(xié)會(huì)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用
前幾年,火車票購(gòu)票網(wǎng)站12306,每到放假高峰期,在線票刷不出來(lái),購(gòu)買困難,甚至出現(xiàn)了各種插件支持搶票,這樣的場(chǎng)景,對(duì)于每個(gè)買過(guò)票的人,應(yīng)該印象深刻。小米手機(jī)的搶購(gòu)活動(dòng),同樣異;鸨趲追昼姷臅r(shí)間內(nèi),賣出幾十萬(wàn)部手機(jī)。當(dāng)一個(gè)Web系統(tǒng),在一秒鐘內(nèi)收到數(shù)以萬(wàn)計(jì)甚至更多請(qǐng)求時(shí),系統(tǒng)的優(yōu)化和穩(wěn)定至關(guān)重要。

在面試中,面試官提出這樣的問(wèn)題,應(yīng)該從哪些角度分析。在工作中,也許沒(méi)有這么龐大復(fù)雜的應(yīng)用場(chǎng)景,但是,針對(duì)網(wǎng)站的優(yōu)化思路是一致的。本文從技術(shù)度度,分析下應(yīng)如何設(shè)計(jì)優(yōu)化系統(tǒng),才能保障如此大規(guī)模的并發(fā)訪問(wèn)。

秒殺系統(tǒng)主要解決三大問(wèn)題:

一、瞬時(shí)的高并發(fā)訪問(wèn)。搶購(gòu)和普通的電商銷售有所不同,普通的電商銷售,流量是比較平均的,雖然有波峰波谷,但不會(huì)特別突出。而搶購(gòu)是在特定時(shí)間點(diǎn)進(jìn)行的推銷活動(dòng),搶購(gòu)開(kāi)始前,用戶不斷刷新頁(yè)面,以獲得購(gòu)買按鈕;搶購(gòu)開(kāi)始的一瞬間,集中并發(fā)購(gòu)買。

二、數(shù)據(jù)正確性。搶購(gòu)畢竟是一種購(gòu)買行為,需要購(gòu)買、扣減庫(kù)存、支付等復(fù)雜的流程,在此過(guò)程中,要保證數(shù)據(jù)的正確性,防止超賣(賣出量超過(guò)庫(kù)存)的發(fā)生。

三、防作弊。無(wú)論是火車票的購(gòu)買,還是低價(jià)商品的促銷,肯定不希望某些客戶買到所有的商品,應(yīng)盡量保證公平性。通過(guò)購(gòu)票插件購(gòu)買火車票,阿里巴巴搶月餅事件等,需要限制技術(shù)性用戶繞過(guò)網(wǎng)站的限制,通過(guò)技術(shù)手段獲得不良收益。

解決上述問(wèn)題,主要有如下的三個(gè)思路:訪問(wèn)攔截,分流,限流。

主流的Web站點(diǎn)采用分層的架構(gòu)設(shè)計(jì),如果你的應(yīng)用還沒(méi)有采用分層的架構(gòu),那么先做分層設(shè)計(jì)吧。一般來(lái)說(shuō),瀏覽器采用了html/js/css技術(shù),負(fù)責(zé)數(shù)據(jù)的展示;反向代理一般采用nginx,負(fù)責(zé)負(fù)載均衡;Web層是指Php,Tomcat等應(yīng)用服務(wù)器,負(fù)責(zé)用戶狀態(tài)的維護(hù),http協(xié)議處理等;service層一般是rpc調(diào)用,當(dāng)然也有用http的,例如spring cloud;數(shù)據(jù)庫(kù)存儲(chǔ)一般是mongodb,mysql等持久化數(shù)據(jù)方案。用戶的一次數(shù)據(jù)訪問(wèn),例如查詢商品庫(kù)存,數(shù)據(jù)是從上層依次調(diào)用到DB,逐層返回?cái)?shù)據(jù)。

所謂訪問(wèn)攔截,是指盡量把訪問(wèn)攔截在上層,減輕下一層的壓力,即離用戶訪問(wèn)更近的那一層。下面將從每一層講解如何做訪問(wèn)攔截。

秒殺搶購(gòu)系統(tǒng)優(yōu)化思路詳解


瀏覽器訪問(wèn)攔截:產(chǎn)品層面,當(dāng)用戶點(diǎn)擊查詢或購(gòu)買按鈕后,按鈕置灰,防止用戶重復(fù)提交數(shù)據(jù)。js層面,限制用戶在限定時(shí)間內(nèi)的接口調(diào)用次數(shù),或者返回相同的值。例如,用戶重復(fù)刷新,每秒訪問(wèn)10次接口,變成5秒鐘訪問(wèn)一次,并發(fā)量將會(huì)降低50倍。此種方法,可以攔截90%的小白用戶的訪問(wèn),但是技術(shù)型的用戶可以繞過(guò)js,通過(guò)腳本或其他自動(dòng)化方式調(diào)用接口,當(dāng)年出現(xiàn)的刷票神器,就屬于這類范疇。用戶量雖小,但是訪問(wèn)量很大。關(guān)于防作弊的問(wèn)題,后續(xù)討論。

CDN加速:CDN的全稱是Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)。其基本思路是盡可能避開(kāi)互聯(lián)網(wǎng)上有可能影響數(shù)據(jù)傳輸速度和穩(wěn)定性的瓶頸和環(huán)節(jié),使內(nèi)容傳輸?shù)母、更穩(wěn)定。簡(jiǎn)單的來(lái)說(shuō),就是把原服務(wù)器上數(shù)據(jù)復(fù)制到其他服務(wù)器上,用戶訪問(wèn)時(shí),那臺(tái)服務(wù)器近訪問(wèn)到的就是那臺(tái)服務(wù)器上的數(shù)據(jù)。CDN的劣勢(shì)是內(nèi)容的變更生效慢,所以僅適用于“幾乎不變”的資源,例如引用的js包,圖片等。

動(dòng)靜分離與反向代理層訪問(wèn)攔截:動(dòng)態(tài)頁(yè)面是指根據(jù)實(shí)時(shí)數(shù)據(jù)渲染的,需要組織數(shù)據(jù)、渲染頁(yè)面;靜態(tài)頁(yè)面是存儲(chǔ)在文件系統(tǒng)的文件,不會(huì)根據(jù)數(shù)據(jù)變化而變化,讀取速度很快。為了提升效率,應(yīng)盡可能的靜態(tài)化,用靜態(tài)頁(yè)面,替換動(dòng)態(tài)頁(yè)面。例如,商品信息頁(yè),商品信息在發(fā)布后,是不會(huì)變化的,如果采用動(dòng)態(tài)的方式,訪問(wèn)數(shù)據(jù)庫(kù)讀取數(shù)據(jù),service組裝數(shù)據(jù),web渲染數(shù)據(jù);如果發(fā)布商品信息時(shí),就保存下商品信息的靜態(tài)頁(yè)面,訪問(wèn)時(shí)只需要讀取一個(gè)文件就夠了。

做了動(dòng)靜分離,靜態(tài)文件的訪問(wèn)應(yīng)在哪一層返回?無(wú)論是tomcat,還是apache,都支持靜態(tài)文件的訪問(wèn),很多時(shí)候我們也是這么做的,把靜態(tài)文件作為web項(xiàng)目的一部分進(jìn)行發(fā)布。Nginx也支持靜態(tài)文件的訪問(wèn),更高效的做法是,把靜態(tài)文件交由nginx管理,訪問(wèn)nginx直接返回靜態(tài)數(shù)據(jù),減輕Web服務(wù)的壓力。

Web層和Service層訪問(wèn)攔截:通過(guò)上述的訪問(wèn)攔截,進(jìn)入到web層的,都是動(dòng)態(tài)數(shù)據(jù)訪問(wèn)。這部分的訪問(wèn)攔截,主要采用緩存的策略,減少對(duì)下一層的數(shù)據(jù)訪問(wèn)。緩存又可分為本地緩存和redis、memcache等緩存中間件。關(guān)于緩存,重點(diǎn)關(guān)注緩存的淘汰策略。一般有三種方式:超時(shí)更新,定時(shí)更新,通知更新。

訪問(wèn)攔截,除了減少向下一層的訪問(wèn),還大幅提高系統(tǒng)的支持用戶數(shù)。訪問(wèn)攔截,大大減少了每次請(qǐng)求的處理時(shí)間,假設(shè):每個(gè)請(qǐng)求原來(lái)需要200ms時(shí)間,10W的并發(fā)量,每秒鐘可處理50W的請(qǐng)求;通過(guò)訪問(wèn)攔截,每個(gè)請(qǐng)求的處理時(shí)間下降到100ms,同樣的并發(fā)量,每秒鐘可處理100W的請(qǐng)求。

通過(guò)上述的分析,各層通過(guò)訪問(wèn)攔截,系統(tǒng)架構(gòu)演變成如下的結(jié)構(gòu)。

秒殺搶購(gòu)系統(tǒng)優(yōu)化思路詳解


在并發(fā)量巨大的場(chǎng)景下,通過(guò)上述的優(yōu)化遠(yuǎn)遠(yuǎn)不夠的,因?yàn)閱闻_(tái)服務(wù)器的處理能力是有限的,即便在當(dāng)前硬件設(shè)備越來(lái)越便宜,也不可能無(wú)限擴(kuò)容。分流就是指通過(guò)多臺(tái)服務(wù)器,并發(fā)的處理請(qǐng)求,減輕單臺(tái)服務(wù)的負(fù)載。

DNS輪詢:Nginx的處理能力是有限的,單臺(tái)服務(wù)器支持10W左右的并發(fā)訪問(wèn),沒(méi)有問(wèn)題。如果更大的負(fù)載怎么辦?Nginx是應(yīng)用服務(wù)的入口,不能再應(yīng)用服務(wù)這個(gè)層次增加服務(wù)器,提高并發(fā)處理能力。

秒殺搶購(gòu)系統(tǒng)優(yōu)化思路詳解


通過(guò)瀏覽器輸入域名訪問(wèn)某個(gè)服務(wù),其過(guò)程如圖所示。DNS輪詢是ISP提供的一個(gè)服務(wù),不同的用戶訪問(wèn)同一個(gè)域名,獲取到不同的IP地址。例如:給www.example.com配置4個(gè)IP地址,如果有40W的并發(fā)訪問(wèn),每個(gè)IP將會(huì)獲得10W的并發(fā)訪問(wèn)。當(dāng)然,域名的IP地址配置,可以支持不同的策略,例如按照電信運(yùn)營(yíng)商分配,按照地域分配等。

Nginx負(fù)載均衡:Nginx可以支持10W的并發(fā)訪問(wèn),而應(yīng)用服務(wù)器卻達(dá)不到這個(gè)水準(zhǔn),tomcat一般支持1W的并發(fā)訪問(wèn)就很好了。Nginx支持配置請(qǐng)求的代理策略,把請(qǐng)求路由到多個(gè)Web服務(wù)器處理。Nginx支持的負(fù)載均衡策略包括:輪詢,權(quán)重,ip_hash,fair,url_hash等。

分布式架構(gòu)的負(fù)載策略:Web層調(diào)用service,以及service之間的調(diào)用,每個(gè)service都需要部署多份。目前最常用的兩個(gè)框架技術(shù),spring cloud和dubbo,都采用客戶端負(fù)載均衡策略,路由到service的不同實(shí)例。

Redis負(fù)載:redis是內(nèi)存的緩存結(jié)構(gòu),非常高效,瓶頸在于網(wǎng)絡(luò)IO,支持幾十萬(wàn)的QPS。redis分流,可考慮分片的設(shè)計(jì),把數(shù)據(jù)分配到多臺(tái)服務(wù)器上,減輕每臺(tái)機(jī)器的負(fù)載。一般情況下,分片策略多用戶redis數(shù)據(jù)擴(kuò)容方案。

Mysql讀寫分離:對(duì)寫請(qǐng)求,不適合做分流,因?yàn)榉至骱蟮臄?shù)據(jù)同步是大問(wèn)題,導(dǎo)致數(shù)據(jù)不一致。對(duì)于寫請(qǐng)求,一般采用讀寫分離的策略,并且可以多臺(tái)讀庫(kù)。讀庫(kù)應(yīng)用MyIsam引擎,單獨(dú)設(shè)置合適的索引,提高讀性能。從庫(kù)并不是越多越好,因?yàn)閺膸?kù)越多,數(shù)據(jù)延遲越嚴(yán)重,要保持好平衡。

通過(guò)上述的分析,各層通過(guò)分流策略,系統(tǒng)架構(gòu)演變成如下的結(jié)構(gòu)。

秒殺搶購(gòu)系統(tǒng)優(yōu)化思路詳解


訪問(wèn)攔截和分流的策略,主要作用還是解決并發(fā)讀的問(wèn)題。購(gòu)買、支付等這類“寫請(qǐng)求”,不能像讀緩存一樣,寫緩存提高效率,數(shù)據(jù)持久化成功,才算交易成功。尤其搶購(gòu)這種模式下,商品數(shù)量少,如果多臺(tái)服務(wù)同事寫數(shù)據(jù),將造成mysql嚴(yán)重的行鎖沖突,執(zhí)行效率遠(yuǎn)遠(yuǎn)不如順序執(zhí)行。并且大量的所等待,延長(zhǎng)單個(gè)操作的時(shí)長(zhǎng),占用工作線程,產(chǎn)生服務(wù)雪崩現(xiàn)象,短時(shí)間內(nèi)不能對(duì)外提供服務(wù)。解決此問(wèn)題的思路是限流,限制寫操作的流量,使其正常運(yùn)行,不影響業(yè)務(wù)。

計(jì)數(shù)器:假設(shè)總共100個(gè)商品庫(kù)存,供大家搶貨,并發(fā)訪問(wèn)極大?梢栽赪eb層做一個(gè)計(jì)數(shù)器,搶單一次計(jì)數(shù)器加1,計(jì)數(shù)器到達(dá)100后,直接返回?fù)屬?gòu)失敗。同樣的道理,計(jì)數(shù)器亦可在service層實(shí)現(xiàn)。這種情況下,假設(shè)有10臺(tái)web服務(wù)器,也只會(huì)放行100 * 10 = 1000次搶購(gòu)。

按商品路由:在Web層,把對(duì)同一品類商品的搶購(gòu)路由到一臺(tái)service處理。在service內(nèi),自定義mysql連接池,使對(duì)同一個(gè)商品的操作,使用同一個(gè)連接。這樣就實(shí)現(xiàn)了對(duì)同一商品的順序處理,避免了鎖競(jìng)爭(zhēng)。

異步化:是指把購(gòu)買請(qǐng)求的接受和處理異步化。購(gòu)買請(qǐng)求先放到隊(duì)列中,這個(gè)過(guò)程非常高效,返回客戶信息。搶購(gòu)服務(wù)訂閱消息隊(duì)列,異步處理購(gòu)買請(qǐng)求,處理成功給用戶發(fā)消息。異步化主要解決成產(chǎn)和消費(fèi)的速度不匹配問(wèn)題,由此類場(chǎng)景都可以采用。

秒殺搶購(gòu)系統(tǒng)優(yōu)化思路詳解


對(duì)于防作弊問(wèn)題,是比較容易處理的。因?yàn)樗械馁?gòu)買,都是登陸用戶的行為,可以很方便的根據(jù)用戶ID進(jìn)行過(guò)濾,只允許一個(gè)客戶購(gòu)買一次。在分布式環(huán)境下,要解決如何記錄用戶ID的問(wèn)題,因?yàn)橥粋(gè)用戶可能被不同的web,不同的service處理。

全局Cache:在redis中開(kāi)辟一個(gè)空間,記錄所有用戶的商品購(gòu)買,處理用戶購(gòu)買請(qǐng)求是,校驗(yàn)緩存中是否已記錄此商品的購(gòu)買,如果已經(jīng)購(gòu)買,則不允許。要解決重復(fù)提交的問(wèn)題,可考慮分布式鎖。

用戶ID路由:參考上一節(jié)的按商品路由,我們同樣可以把對(duì)一個(gè)用戶的處理,路由到同一個(gè)Service處理,只需要做本地緩存就夠了。此種方案最大的問(wèn)題是,如果服務(wù)掛了,數(shù)據(jù)就錯(cuò)亂了。

本文僅代表作者個(gè)人觀點(diǎn),不代表SEO研究協(xié)會(huì)網(wǎng)官方發(fā)聲,對(duì)觀點(diǎn)有疑義請(qǐng)先聯(lián)系作者本人進(jìn)行修改,若內(nèi)容非法請(qǐng)聯(lián)系平臺(tái)管理員,郵箱cxb5918@163.com。更多相關(guān)資訊,請(qǐng)到SEO研究協(xié)會(huì)網(wǎng)bingfeng168.cn學(xué)習(xí)互聯(lián)網(wǎng)營(yíng)銷技術(shù)請(qǐng)到巨推學(xué)院www.jutuiedu.com。

標(biāo)簽: dns dns輪詢 isp Mysql seo web服務(wù)器 電商 電商銷售 服務(wù)器 互聯(lián)網(wǎng) 腳本 數(shù)據(jù)庫(kù) 網(wǎng)絡(luò) 學(xué)習(xí)互聯(lián)網(wǎng) 應(yīng)用服務(wù)器 域名

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:如何分析競(jìng)爭(zhēng)對(duì)手seo優(yōu)化優(yōu)劣勢(shì)

下一篇:URL偽靜態(tài)的好處及對(duì)網(wǎng)站優(yōu)化的影響