您好,登錄后才能下訂單哦!
秒殺系統(tǒng)設(shè)計(jì)方案
一、秒殺系統(tǒng)架構(gòu)設(shè)計(jì)關(guān)鍵點(diǎn)
1.兩個(gè)問題,一個(gè)備選方案
(1)秒殺其實(shí)主要解決兩個(gè)問題
一個(gè)是并發(fā)讀,并發(fā)讀的核心理念是盡量減少用戶到服務(wù)端來“讀”數(shù)據(jù),或者讀更少的數(shù)據(jù)。
一個(gè)是并發(fā)寫,并發(fā)寫我們?cè)跀?shù)據(jù)庫(kù)層面獨(dú)立出來一個(gè)庫(kù),做特殊的處理。
(2)還要針對(duì)秒殺系統(tǒng)做一些保護(hù),針對(duì)意料之外的情況設(shè)計(jì)兜底案,以防止最壞的情況發(fā)生。
2.從架構(gòu)師的角度來看,要想打造超大流量并發(fā)讀寫、高性能、高可用的系統(tǒng),我們要遵循幾個(gè)原則
(1)請(qǐng)求的數(shù)據(jù)盡量少
(2)請(qǐng)求數(shù)盡少
(3)并且不要有單點(diǎn)
3.技術(shù)角度上看“穩(wěn)、準(zhǔn)、快”
(1)高性能中高并發(fā)訪問非常關(guān)鍵,處理方式有以下4點(diǎn)
設(shè)計(jì)數(shù)據(jù)的動(dòng)靜分離方案、
熱點(diǎn)的發(fā)現(xiàn)與隔離、
請(qǐng)求的削峰與分層過濾、
服務(wù)端的極致優(yōu)化、
(2)一致性中商品減庫(kù)存的實(shí)現(xiàn)方式同樣關(guān)鍵,主要有以下兩種扣減方式
拍下減庫(kù)存
付款減庫(kù)存
(3)高可用還要設(shè)計(jì)一個(gè)備選來兜底
二、秒殺系統(tǒng)應(yīng)該注意的5個(gè)原則(結(jié)合業(yè)務(wù)動(dòng)態(tài)平衡)
1.?dāng)?shù)據(jù)要盡量少
(1)用戶請(qǐng)求的數(shù)據(jù)能少就少
用戶請(qǐng)求的數(shù)據(jù)包括,上傳給系統(tǒng)的數(shù)據(jù)和系統(tǒng)返回的數(shù)據(jù)。用戶請(qǐng)求的數(shù)據(jù)盡量少的原因是,網(wǎng)絡(luò)上數(shù)據(jù)傳輸需要時(shí)間,不管是請(qǐng)求數(shù)據(jù)還是返回?cái)?shù)據(jù)都需要服務(wù)器做處理,服務(wù)器在做網(wǎng)絡(luò)通信都要做壓縮和字符編碼,這些都非常消耗CPU,所以要減少傳輸?shù)臄?shù)據(jù)量。
(2)系統(tǒng)依賴的數(shù)據(jù)能少就少
系統(tǒng)要完成某些業(yè)務(wù)需要讀取和保存數(shù)據(jù),一般需要和后臺(tái)服務(wù)及數(shù)據(jù)庫(kù)打交道。調(diào)用其他服務(wù)會(huì)涉及數(shù)據(jù)的系列化和反序列化,而這些也是CPU的一大殺手,同樣也會(huì)增加延時(shí)。數(shù)據(jù)庫(kù)本身也容易是一個(gè)瓶頸,所以和數(shù)據(jù)庫(kù)打交道越少越好,數(shù)據(jù)越簡(jiǎn)單、越小則越好。
2.請(qǐng)求數(shù)要盡量少
(1)額外請(qǐng)求盡量減少
瀏覽器每發(fā)出一個(gè)請(qǐng)求都會(huì)有一些消耗,如三次握手,有的時(shí)候頁(yè)面或者鏈接數(shù)限制,一些請(qǐng)求還需要串行加載等。域名不一樣的話,還涉及這些域名的DNS解析,可能會(huì)耗時(shí)更久。
(2)合并CSS和JavaScript文件
在URL中用逗號(hào)隔開,在服務(wù)端仍然是單個(gè)文件各自存放,服務(wù)端自動(dòng)解析這個(gè)URL,合并成一個(gè)文件一起返回。
3.路徑要盡量短
(1)經(jīng)過一個(gè)節(jié)點(diǎn)一般都會(huì)產(chǎn)生一個(gè)socket鏈接
縮短請(qǐng)求路徑不僅可以增加可用性,還可以提升性能(序列化、反序列化),減少延時(shí)(網(wǎng)絡(luò)傳輸耗時(shí))。
(2)RPC調(diào)用換成JVM調(diào)用
RPC調(diào)用換成JVM調(diào)用酌情處理。
4.依賴要盡量少
(1)完成一次用戶請(qǐng)求必須依賴的系統(tǒng)或者服務(wù)盡量減少
若依賴在緊急情況下可以去掉,比如:秒殺頁(yè)面,這個(gè)頁(yè)面必須強(qiáng)依賴商品信息、用戶信息,還有其他優(yōu)惠券、成交列表這些對(duì)秒殺不是非要不可的信息,在緊急情況下可以去掉。
(2)建立系統(tǒng)級(jí)別
我們可以給系統(tǒng)進(jìn)行分級(jí),比如:0 級(jí)系統(tǒng)、1 級(jí)系統(tǒng)、2 級(jí)系統(tǒng)、3 級(jí)系統(tǒng),0 級(jí)系統(tǒng)如果是最重要的系統(tǒng),那么 0 級(jí)系統(tǒng)強(qiáng)依賴的系統(tǒng)也同樣是最重要的系統(tǒng),以此類推。0 級(jí)系統(tǒng)要盡量減少對(duì) 1 級(jí)系統(tǒng)的強(qiáng)依賴,防止重要的系統(tǒng)被不重要的系統(tǒng)拖垮。
5.不要有單點(diǎn)
(1)設(shè)計(jì)系統(tǒng)最重要的就是消除單點(diǎn)
單點(diǎn)意味著沒有備份,風(fēng)險(xiǎn)不可控
(2)避免單點(diǎn)的方案
避免服務(wù)和狀態(tài)綁定,服務(wù)無狀態(tài)化。比如:把機(jī)器和相關(guān)配置動(dòng)態(tài)化,配置通過配置中心動(dòng)態(tài)推送。
三、不同場(chǎng)景下的不同架構(gòu)案例
1.比如從 1w/s 到了 10w/s 的量級(jí)
把秒殺系統(tǒng)獨(dú)立開發(fā),針對(duì)性的做優(yōu)化。系統(tǒng)部署上做機(jī)器集群,秒殺流量不會(huì)影響正常商品購(gòu)買。熱點(diǎn)數(shù)據(jù)單獨(dú)存放在一個(gè)獨(dú)立的緩存系統(tǒng),提高性能。增加秒殺答題,防止有秒殺器搶單。
2.100w/s的請(qǐng)求量級(jí)
對(duì)頁(yè)面進(jìn)行徹底動(dòng)靜分離,使秒殺時(shí)不需要刷新整個(gè)頁(yè)面,只需要點(diǎn)擊搶寶按鈕,把刷新的數(shù)據(jù)降到最少。服務(wù)端對(duì)秒殺商品進(jìn)行本地緩存,不需要調(diào)用依賴系統(tǒng)的后臺(tái)服務(wù)獲取數(shù)據(jù),甚至不需要去公共緩存集群中查詢數(shù)據(jù),這樣不僅可以減少系統(tǒng)調(diào)用,而且能夠減少公共緩存集群的壓力。增加系統(tǒng)限流保護(hù),防止最壞情況發(fā)生。
四、動(dòng)靜分離可選方案
1.動(dòng)態(tài)數(shù)據(jù)和靜態(tài)數(shù)據(jù)的定義
動(dòng)態(tài)數(shù)據(jù)跟訪問者相關(guān)的個(gè)性化數(shù)據(jù),靜態(tài)數(shù)據(jù)包括存放在硬盤上的html頁(yè)面,和與訪問者無關(guān)的由業(yè)務(wù)處理數(shù)據(jù)
2.靜態(tài)數(shù)據(jù)做緩存的要點(diǎn)
靜態(tài)數(shù)據(jù)緩存到離用戶最近的地方??梢源嬖冢g覽器、CDN、服務(wù)器Cache),
靜態(tài)化改造(直接緩存http鏈接,而不是僅僅緩存數(shù)據(jù)),
Web服務(wù)器直接緩存靜態(tài)數(shù)據(jù)(nginx、apache)。
3.動(dòng)靜分離5個(gè)方面
URL唯一化(分區(qū)保存)
分離瀏覽者相關(guān)因素(是否登錄、登錄身份等,通過動(dòng)態(tài)請(qǐng)求獲?。?br/>分離時(shí)間因素(服務(wù)器輸出時(shí)間通過動(dòng)態(tài)請(qǐng)求獲?。?br/>異步化地域因素(通過異步獲取地域相關(guān)信息)
去掉Cookie,靜態(tài)頁(yè)面不含cookie(通過代碼軟件刪除)
4.靜態(tài)數(shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)組裝
在代理服務(wù)器上做動(dòng)態(tài)數(shù)據(jù)請(qǐng)求,并將動(dòng)態(tài)數(shù)據(jù)插入到靜態(tài)頁(yè)面中
瀏覽器發(fā)起動(dòng)態(tài)請(qǐng)求,瀏覽器進(jìn)行頁(yè)面組裝
5.動(dòng)靜分離的幾種架構(gòu)方案
實(shí)體機(jī)單機(jī)部署
統(tǒng)一cache
上CDN(有幾個(gè)問題:1,失效問題;2,命中率問題;3,發(fā)布更新問題;)
五、針對(duì)性地處理好系統(tǒng)“熱點(diǎn)數(shù)據(jù)”二八原則
1.熱點(diǎn)數(shù)據(jù)處理
(1)發(fā)現(xiàn)靜態(tài)熱點(diǎn)數(shù)據(jù)的方式
通過報(bào)名方式篩選熱點(diǎn)商品,后臺(tái)系統(tǒng)對(duì)熱點(diǎn)數(shù)據(jù)進(jìn)行預(yù)處理。
系統(tǒng)預(yù)測(cè),系統(tǒng)每天排除top N的商品,后臺(tái)系統(tǒng)對(duì)熱點(diǎn)數(shù)據(jù)進(jìn)行預(yù)處理。
(2)發(fā)現(xiàn)動(dòng)態(tài)熱點(diǎn)數(shù)據(jù)的方式
構(gòu)建一個(gè)異步系統(tǒng),它可以收集交易鏈路上的各個(gè)環(huán)節(jié)中的中間件產(chǎn)品的熱點(diǎn)key,如Nginx、緩存、RPC服務(wù)框架等這些中間件。
建立一個(gè)熱點(diǎn)上報(bào)和可以按照需求訂閱的熱點(diǎn)服務(wù)的下發(fā)規(guī)范,主要目的是通過交易鏈路上各個(gè)系統(tǒng)訪問的時(shí)間差,把上游系統(tǒng)已經(jīng)發(fā)現(xiàn)的熱點(diǎn)同傳給下游系統(tǒng),提前做好保護(hù)。
將上游系統(tǒng)收集的熱點(diǎn)數(shù)據(jù)發(fā)送到熱點(diǎn)服務(wù)器,然后下游系統(tǒng)做熱點(diǎn)保護(hù)。
2.打造熱點(diǎn)發(fā)現(xiàn)系統(tǒng)注意事項(xiàng)
熱點(diǎn)服務(wù)后臺(tái)抓取數(shù)據(jù)日志采用異步方式
熱點(diǎn)服務(wù)發(fā)現(xiàn)和中間件的熱點(diǎn)保護(hù)模塊并存
熱點(diǎn)發(fā)下要做到接近實(shí)時(shí)
3.處理熱點(diǎn)數(shù)據(jù)
(1)優(yōu)化熱點(diǎn)數(shù)據(jù)
優(yōu)化熱點(diǎn)數(shù)據(jù)最有效的方法就是緩存熱點(diǎn)數(shù)據(jù),緩存數(shù)據(jù)可以用LRU淘汰算法替換。
(2)限制
根據(jù)商品id做一致性Hash,放入不同的隊(duì)列中,防止因某些商品占用太多的服務(wù)。
(3)隔離
將這種熱點(diǎn)數(shù)據(jù)隔離出來,不讓1%的請(qǐng)求影響到另外99%的請(qǐng)求。
隔離有以下幾個(gè)層次,業(yè)務(wù)隔離、系統(tǒng)隔離、數(shù)據(jù)隔離
六、流量削峰方案
1.排隊(duì)
把一步的操作變成兩步的操作,增加一步起到緩沖的作用。
2.答題
防止部分秒殺器作弊
延緩請(qǐng)求,請(qǐng)求量削峰
3.分層過濾
將動(dòng)態(tài)請(qǐng)求的讀數(shù)據(jù)緩存在web端,過濾掉無效數(shù)據(jù);
讀數(shù)據(jù)不做強(qiáng)一致校驗(yàn);
對(duì)寫數(shù)據(jù)進(jìn)行基于時(shí)間的合理分片,過濾掉過期的失效請(qǐng)求;
對(duì)寫請(qǐng)求做限流保護(hù),將超出系統(tǒng)承載能力的請(qǐng)求過濾掉;
對(duì)寫數(shù)據(jù)進(jìn)行強(qiáng)一致校驗(yàn),只保留最后有效數(shù)據(jù);
七、提高系統(tǒng)性能方案
1.影響性能的因素(服務(wù)器性能一般用QPS來衡量)
(1)一次響應(yīng)的服務(wù)端耗時(shí),對(duì)性能有影響的是CPU的執(zhí)行時(shí)間
(2)處理請(qǐng)求的線程數(shù),合理的并發(fā)線程數(shù)
八、減庫(kù)存設(shè)計(jì)核心邏輯
1.減庫(kù)存的3種方式,以及可能存在的問題
(1)下單減庫(kù)存,下單不付款(大型秒殺系統(tǒng)一般使用下單減庫(kù)存)
(2)付款減庫(kù)存,庫(kù)存超賣
(3)預(yù)扣庫(kù)存(下單后庫(kù)存保留一定時(shí)間)
2.秒殺減庫(kù)存的極致優(yōu)化
(1)秒殺商品的減庫(kù)存邏輯非常單一,可以再緩存系統(tǒng)完成扣減
(2)比較復(fù)雜的庫(kù)存扣減邏輯,要在數(shù)據(jù)庫(kù)中完成扣減
九、備選方案的設(shè)計(jì)
1.高可用建設(shè)應(yīng)該從哪里著手
(1)架構(gòu)階段
主要考慮可擴(kuò)展性和容錯(cuò)性,避免出現(xiàn)單機(jī)
(2)編碼階段
主要考慮代碼的健壯性,涉及遠(yuǎn)程調(diào)用要設(shè)置合理的超時(shí)退出
也要對(duì)調(diào)用的返回結(jié)果集有預(yù)期,防止返回的結(jié)果超出程序處理的范圍
(3)測(cè)試階段
保證測(cè)試用例的覆蓋度
保證最壞的情況發(fā)生時(shí),有相應(yīng)的處理流程
(4)發(fā)布階段
要有緊急的回滾機(jī)制
(5)運(yùn)行階段
對(duì)系統(tǒng)的監(jiān)控要準(zhǔn)確及時(shí)
發(fā)現(xiàn)問題能準(zhǔn)確報(bào)警,數(shù)據(jù)要準(zhǔn)確詳細(xì),以便排查問題
(6)故障發(fā)生
及時(shí)止損
及時(shí)恢復(fù),并定位原因解決問題
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。