您好,登錄后才能下訂單哦!
最近在部門(mén)內(nèi)部分享了原來(lái)在電商業(yè)務(wù)做秒殺活動(dòng)的整體思路,大家對(duì)這次分享反饋還不錯(cuò),所以我就簡(jiǎn)單整理了一下,分享給大家參考參考
什么是秒殺?通俗一點(diǎn)講就是網(wǎng)絡(luò)商家為促銷(xiāo)等目的組織的網(wǎng)上限時(shí)搶購(gòu)活動(dòng)
比如說(shuō)京東秒殺,就是一種定時(shí)定量秒殺,在規(guī)定的時(shí)間內(nèi),無(wú)論商品是否秒殺完畢,該場(chǎng)次的秒殺活動(dòng)都會(huì)結(jié)束。這種秒殺,對(duì)時(shí)間不是特別嚴(yán)格,只要下手快點(diǎn),秒中的概率還是比較大的。
淘寶以前就做過(guò)一元搶購(gòu),一般都是限量 1 件商品,同時(shí)價(jià)格低到「令人發(fā)齒」,這種秒殺一般都在開(kāi)始時(shí)間 1 到 3 秒內(nèi)就已經(jīng)搶光了,參與這個(gè)秒殺一般都是看運(yùn)氣的,不必太強(qiáng)求
秒殺時(shí)會(huì)有大量用戶(hù)在同一時(shí)間進(jìn)行搶購(gòu),瞬時(shí)并發(fā)訪(fǎng)問(wèn)量突增 10 倍,甚至 100 倍以上都有。
一般秒殺活動(dòng)商品量很少,這就導(dǎo)致了只有極少量用戶(hù)能成功購(gòu)買(mǎi)到。
流程比較簡(jiǎn)單,一般都是下訂單、扣庫(kù)存、支付訂單
秒殺是營(yíng)銷(xiāo)活動(dòng)中的一種,如果和其他營(yíng)銷(xiāo)活動(dòng)應(yīng)用部署在同一服務(wù)器上,肯定會(huì)對(duì)現(xiàn)有其他活動(dòng)造成沖擊,極端情況下可能導(dǎo)致整個(gè)電商系統(tǒng)服務(wù)宕機(jī)
下單頁(yè)面是一個(gè)正常的 URL 地址,需要控制在秒殺開(kāi)始前,不能下訂單,只能瀏覽對(duì)應(yīng)活動(dòng)商品的信息。簡(jiǎn)單來(lái)說(shuō),需要 Disable 訂單按鈕
秒殺活動(dòng)開(kāi)始前后,會(huì)有很多用戶(hù)請(qǐng)求對(duì)應(yīng)商品頁(yè)面,會(huì)造成后臺(tái)服務(wù)器的流量突增,同時(shí)對(duì)應(yīng)的網(wǎng)絡(luò)帶寬增加,需要控制商品頁(yè)面的流量不會(huì)對(duì)后臺(tái)服務(wù)器、DB、Redis 等組件的造成過(guò)大的壓力
由于活動(dòng)庫(kù)存量一般都是很少,對(duì)應(yīng)的只有少部分用戶(hù)才能秒殺成功。所以我們需要限制大部分用戶(hù)流量,只準(zhǔn)少量用戶(hù)流量進(jìn)入后端服務(wù)器
秒殺開(kāi)始的那一瞬間,會(huì)有大量用戶(hù)沖擊進(jìn)來(lái),所以在開(kāi)始時(shí)候會(huì)有一個(gè)瞬間流量峰值。如何把瞬間的流量峰值變得更平緩,是能否成功設(shè)計(jì)好秒殺系統(tǒng)的關(guān)鍵因素。實(shí)現(xiàn)流量削峰填谷,一般的采用緩存和 MQ 中間件來(lái)解決
秒殺其實(shí)可以當(dāng)做高并發(fā)系統(tǒng)來(lái)處理,在這個(gè)時(shí)候,可以考慮從業(yè)務(wù)上做兼容,將同步的業(yè)務(wù),設(shè)計(jì)成異步處理的任務(wù),提高網(wǎng)站的整體可用性
秒殺系統(tǒng)的瓶頸主要體現(xiàn)在下訂單、扣減庫(kù)存流程中。在這些流程中主要用到 OLTP 的數(shù)據(jù)庫(kù),類(lèi)似 MySQL、SQLServer、Oracle。由于數(shù)據(jù)庫(kù)底層采用 B+ 樹(shù)的儲(chǔ)存結(jié)構(gòu),對(duì)應(yīng)我們隨機(jī)寫(xiě)入與讀取的效率,相對(duì)較低。如果我們把部分業(yè)務(wù)邏輯遷移到內(nèi)存的緩存或者 Redis 中,會(huì)極大的提高并發(fā)效率
客戶(hù)端優(yōu)化主要有兩個(gè)問(wèn)題
秒殺活動(dòng)開(kāi)始前,其實(shí)就有很多用戶(hù)訪(fǎng)問(wèn)該頁(yè)面了。如果這個(gè)頁(yè)面的一些資源,比如 CSS、JS、圖片、商品詳情等,都訪(fǎng)問(wèn)后端服務(wù)器,甚至 DB 的話(huà),服務(wù)肯定會(huì)出現(xiàn)不可用的情況。所以一般我們會(huì)把這個(gè)頁(yè)面整體進(jìn)行靜態(tài)化,并將頁(yè)面靜態(tài)化之后的頁(yè)面分發(fā)到 CDN 邊緣節(jié)點(diǎn)上,起到壓力分散的作用
防止提前下單主要是在靜態(tài)化頁(yè)面中加入一個(gè) JS 文件引用,該 JS 文件包含活動(dòng)是否開(kāi)始的標(biāo)記以及開(kāi)始時(shí)的動(dòng)態(tài)下單頁(yè)面的 URL 參數(shù)。同時(shí),這個(gè) JS 文件是不會(huì)被 CDN 系統(tǒng)緩存的,會(huì)一直請(qǐng)求后端服務(wù)的,所以這個(gè) JS 文件一定要很小。當(dāng)活動(dòng)快開(kāi)始的時(shí)候(比如提前),通過(guò)后臺(tái)接口修改這個(gè) JS 文件使之生效
客戶(hù)端優(yōu)化,對(duì)于不是搞計(jì)算機(jī)方面的用戶(hù)還是可以防止住的。但是稍有一定網(wǎng)絡(luò)基礎(chǔ)的用戶(hù)就起不到作用了,因此服務(wù)端也需要加些對(duì)應(yīng)控制,不能信任客戶(hù)端的任何操作。一般控制分為 2 大類(lèi)
針對(duì)同一個(gè)用戶(hù)( Userid 維度),做頁(yè)面級(jí)別緩存,單元時(shí)間內(nèi)的請(qǐng)求,統(tǒng)一走緩存,返回同一個(gè)頁(yè)面
大量請(qǐng)求同時(shí)間段查詢(xún)同一個(gè)商品時(shí),可以做頁(yè)面級(jí)別緩存,不管下回是誰(shuí)來(lái)訪(fǎng)問(wèn),只要是這個(gè)頁(yè)面就直接返回
上面兩層只能限制異常用戶(hù)訪(fǎng)問(wèn),如果秒殺活動(dòng)運(yùn)營(yíng)的比較好,很多用戶(hù)都參加了,就會(huì)造成系統(tǒng)壓力過(guò)大甚至宕機(jī),因此需要后端流量控制
對(duì)于后端系統(tǒng)的控制可以通過(guò)消息隊(duì)列、異步處理、提高并發(fā)等方式解決。對(duì)于超過(guò)系統(tǒng)水位線(xiàn)的請(qǐng)求,直接采取 「Fail-Fast」原則,拒絕掉
秒殺系統(tǒng)核心在于層層過(guò)濾,逐漸遞減瞬時(shí)訪(fǎng)問(wèn)壓力,減少最終對(duì)數(shù)據(jù)庫(kù)的沖擊。通過(guò)上面流程圖就會(huì)發(fā)現(xiàn)壓力最大的地方在哪里?
MQ 排隊(duì)服務(wù),只要 MQ 排隊(duì)服務(wù)頂住,后面下訂單與扣減庫(kù)存的壓力都是自己能控制的,根據(jù)數(shù)據(jù)庫(kù)的壓力,可以定制化創(chuàng)建訂單消費(fèi)者的數(shù)量,避免出現(xiàn)消費(fèi)者數(shù)據(jù)量過(guò)多,導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大或者直接宕機(jī)。
庫(kù)存服務(wù)專(zhuān)門(mén)為秒殺的商品提供庫(kù)存管理,實(shí)現(xiàn)提前鎖定庫(kù)存,避免超賣(mài)的現(xiàn)象。同時(shí),通過(guò)超時(shí)處理任務(wù)發(fā)現(xiàn)已搶到商品,但未付款的訂單,并在規(guī)定付款時(shí)間后,處理這些訂單,將恢復(fù)訂單商品對(duì)應(yīng)的庫(kù)存量
核心思想:層層過(guò)濾
免責(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)容。