淺談秒殺系統(tǒng)架構(gòu)設(shè)計(jì)

秒殺是電子商務(wù)網(wǎng)站常見(jiàn)的一種營(yíng)銷手段。

原則

  • 不要整個(gè)系統(tǒng)宕機(jī)。
  • 即使系統(tǒng)故障,也不要將錯(cuò)誤數(shù)據(jù)展示出來(lái)。
  • 盡量保持公平公正。

實(shí)現(xiàn)效果

  • 秒殺開(kāi)始前,搶購(gòu)按鈕為活動(dòng)未開(kāi)始。
  • 秒殺開(kāi)始時(shí),搶購(gòu)按鈕可以點(diǎn)擊下單。
  • 秒殺結(jié)束后,按鈕按鈕變成秒殺已結(jié)束。

技術(shù)攻關(guān)

  • 短時(shí)間內(nèi)的大訪問(wèn)量對(duì)現(xiàn)有網(wǎng)站業(yè)務(wù)造成的沖擊。

    秒殺是一個(gè)網(wǎng)站營(yíng)銷的一個(gè)附加活動(dòng),時(shí)間短,并發(fā)量大。

    如果和網(wǎng)站原有應(yīng)用部署在一起,必然會(huì)對(duì)現(xiàn)有業(yè)務(wù)造成沖擊,稍有不慎可能導(dǎo)致整個(gè)網(wǎng)站癱瘓。

  • 高并發(fā)下對(duì)服務(wù)器數(shù)據(jù)庫(kù)造成的極大負(fù)載壓力。

    用戶秒殺開(kāi)始前,通過(guò)不斷刷新瀏覽器來(lái)保證不會(huì)錯(cuò)過(guò)秒殺活動(dòng)。

    頻繁的訪問(wèn)程序、數(shù)據(jù)庫(kù)會(huì)對(duì)應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器造成負(fù)載壓力。

  • 網(wǎng)絡(luò)帶寬的問(wèn)題比超過(guò)平時(shí)好多倍。

    如果秒殺頁(yè)面的大小為200K,如果最大并發(fā)數(shù)為10000次,那么需要的網(wǎng)絡(luò)和服務(wù)器帶寬是2G(200K×10000)。

    這些網(wǎng)絡(luò)帶寬是因?yàn)槊霘⒒顒?dòng)新增的,超過(guò)網(wǎng)站平時(shí)使用的帶寬。

  • 避免直接下單。

    秒殺的游戲規(guī)則是到了秒殺才能開(kāi)始對(duì)商品下單購(gòu)買,在此時(shí)間點(diǎn)之前,只能瀏覽信息不可下單。

    而下單頁(yè)面也是一個(gè)普通的URL,如果得到這個(gè)URL,不用等到秒殺開(kāi)始就可以下單了。

應(yīng)對(duì)策略

  • 秒殺系統(tǒng)獨(dú)立部署

    為了避免短時(shí)間內(nèi)的大訪問(wèn)量對(duì)現(xiàn)有網(wǎng)站業(yè)務(wù)造成的沖擊,可以將秒殺系統(tǒng)獨(dú)立部署。

    如果需要還可以使用獨(dú)立域名,使其與網(wǎng)站完全隔離。

    即使秒殺系統(tǒng)崩潰了,也不會(huì)對(duì)網(wǎng)站造成影響。

  • 秒殺商品頁(yè)面靜態(tài)化

    將商品描述、參數(shù)、詳情,全部寫(xiě)到一個(gè)靜態(tài)頁(yè)面,不用進(jìn)行程序的邏輯處理,不需訪問(wèn)數(shù)據(jù)庫(kù)。

    不用部署動(dòng)態(tài)的服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器。

  • 租借秒殺活動(dòng)的網(wǎng)絡(luò)帶寬

    因?yàn)槊霘⑿略龅木W(wǎng)絡(luò)帶寬,必須和運(yùn)營(yíng)商重新購(gòu)買或租借帶寬。

    為了減輕服務(wù)器的壓力,需要將秒殺商品頁(yè)面緩存在CDN,同樣CDN服務(wù)器也需要臨時(shí)租借帶寬。

  • 動(dòng)態(tài)生成隨機(jī)下單頁(yè)面的URL

    為了避免用戶直接訪問(wèn)下單URL,需要將URL動(dòng)態(tài)化,用隨機(jī)數(shù)作為參數(shù),只能秒殺開(kāi)始的時(shí)候才生成。

架構(gòu)設(shè)計(jì)

  • 如何控制秒殺商品頁(yè)面搶購(gòu)按鈕的可用/禁用。

    購(gòu)買按鈕只有在秒殺開(kāi)始的時(shí)候才能點(diǎn)亮,在此之前是灰色的,顯示活動(dòng)未開(kāi)始。

    如果頁(yè)面是動(dòng)態(tài)生成的,每次刷新都要請(qǐng)求服務(wù)器,那么勢(shì)必造成服務(wù)端的負(fù)載壓力。

    如果頁(yè)面是靜態(tài)頁(yè)面的話,可以將頁(yè)面緩存在CDN,反向代理服務(wù)器上,甚至用戶瀏覽器上。

    但是這樣,秒殺開(kāi)始時(shí),用戶刷新頁(yè)面,根本請(qǐng)求不到應(yīng)用服務(wù)器。

    解決方案:

    使用JS腳本控制,在頁(yè)面中引用一個(gè)JS文件(文件極小),但是該文件不要被緩存。

    該JS的作用是,包含秒殺開(kāi)始標(biāo)志,修改樣式,生成下單頁(yè)面的URL及隨機(jī)參數(shù)。

    該JS文件不被緩存的做法:xxx.js?v=隨機(jī)數(shù)。

    會(huì)有一臺(tái)服務(wù)器進(jìn)行監(jiān)控(定時(shí)上下架):

    當(dāng)秒殺活動(dòng)開(kāi)始時(shí)推送該文件。

    當(dāng)秒殺活動(dòng)結(jié)束時(shí)推送文件,標(biāo)示結(jié)束標(biāo)志,修改樣式。

    如下圖。

淺談秒殺系統(tǒng)架構(gòu)設(shè)計(jì)-1
  • 如何只允許,第一個(gè)提交的單進(jìn)入訂單系統(tǒng)。

    由于秒殺到商品的用戶只有一個(gè),因此需要在提交訂單時(shí),進(jìn)行下單前置檢查。

    如果已經(jīng)有訂單提交成功,表示活動(dòng)結(jié)束,進(jìn)入秒殺結(jié)束頁(yè)面。

    事實(shí)上,訂單數(shù)只能有一個(gè),為了減輕下單頁(yè)面服務(wù)器的負(fù)載壓力,可以控制進(jìn)入下單頁(yè)面的入口。

    只有少數(shù)用戶能進(jìn)入下單頁(yè)面,其他用戶直接進(jìn)入秒殺結(jié)束頁(yè)面。

    (前置檢查邏輯)檢查本機(jī)已處理的下單請(qǐng)求數(shù)目:

    如果超過(guò)10條,直接返回已結(jié)束頁(yè)面給用戶。

    如果未超過(guò)10條,則用戶可進(jìn)入填寫(xiě)訂單及確認(rèn)頁(yè)面。

    (前置檢查邏輯)檢查全局已提交訂單數(shù)目:

    已超過(guò)秒殺商品總數(shù),返回秒殺結(jié)束頁(yè)面。

    未超過(guò)秒殺商品總數(shù),提交到子訂單系統(tǒng)。

    如下圖。

淺談秒殺系統(tǒng)架構(gòu)設(shè)計(jì)-2
  • 減庫(kù)存的操作

    拍下減庫(kù)存(用戶體驗(yàn)好)

    付款減庫(kù)存

下訂單盡可能簡(jiǎn)單,購(gòu)買數(shù)據(jù)為1且不可編輯,送貨地址和付款方式為空或用戶默認(rèn),允許訂單提交后修改。

文章借鑒書(shū)籍《大型網(wǎng)站技術(shù)架構(gòu)》。


Thanks ~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容