秒殺是電商平臺(tái)的常見配置,用戶看到的呈現(xiàn)效果都需要后端的支持,那么,秒殺的后端系統(tǒng)如何根據(jù)前端業(yè)務(wù)需求做調(diào)整?筆者針對(duì)這個(gè)問題,進(jìn)行了具體的闡述。
秒殺是電商平臺(tái)的常見配置,用戶看到的呈現(xiàn)效果都需要后端的支持,那么,秒殺的后端系統(tǒng)如何根據(jù)前端業(yè)務(wù)需求做調(diào)整?筆者針對(duì)這個(gè)問題,進(jìn)行了具體的闡述。
秒殺是電商平臺(tái)最常用的促銷活動(dòng),例如京東淘寶等主流電商平臺(tái)把秒殺、搶購作為一個(gè)功能入口存在,定期秒殺。
其產(chǎn)品定位在于通過低價(jià)促銷吸引對(duì)價(jià)格敏感的用戶,起到引流促活,且?guī)?dòng)銷售。
下圖是京東、淘寶的秒殺頁面。
那么一個(gè)秒殺系統(tǒng)如何搭建?前后端功能如何配合?
都說“前端一小步,后端一大步”,對(duì)于C端來說,價(jià)格、商品吸引人,我能到特定時(shí)間去搶購、付款就可以了。
那么,后端如何做相應(yīng)的功能支撐呢?
下面我具體闡述一下。
一、秒殺架構(gòu)
秒殺架構(gòu)
從此架構(gòu)看出,一個(gè)秒殺完整的系統(tǒng)搭建,后端需要有商家報(bào)名參與入口、秒殺活動(dòng)的設(shè)置、后臺(tái)秒殺活動(dòng)、訂單管理等功能。
二、 商家報(bào)名流程
平臺(tái)可以給商家提供這樣的功能入口,一旦商家有意愿做秒殺活動(dòng),可以發(fā)起由平臺(tái)審核,審核通過即可上架。
- 商家是否滿足要求:是否對(duì)參與商家設(shè)置門檻,比如經(jīng)營較好,店鋪綜合評(píng)分較高的店鋪方可參與;
- 提報(bào)商品是否滿足:比如此商品設(shè)置價(jià)格合理,是否是違規(guī)商品等。
這里我只簡單論述,具體需根據(jù)每個(gè)企業(yè)業(yè)務(wù)性質(zhì)進(jìn)行考量。
三、秒殺活動(dòng)設(shè)置
- 活動(dòng)信息:包括秒殺時(shí)間、渠道、秒殺模板(不會(huì)做圖的商家可提供模板套用);
- 活動(dòng)限制條件:每個(gè)用戶的限制購買次數(shù)、購買數(shù)量等;
- 活動(dòng)商品:設(shè)置活動(dòng)商品價(jià)格、庫存、時(shí)間段等。
對(duì)于C端用戶是否有意愿參與秒殺、是否有心儀的商品、搶購流程是否順暢等需求點(diǎn)進(jìn)行考慮。
- 是否有意愿參與秒殺:首先前端交互效果一定要引人入勝;
- 是否有心儀商品:價(jià)格、商品是否吸引用戶;
- 搶購是否順暢:活動(dòng)預(yù)熱是否充分,可設(shè)置提醒/活動(dòng)開始時(shí)候庫存是否充足,是否超過限購數(shù)量,售完是否可以原價(jià)購買等;
下面是我自己整理的秒殺流程圖,僅供借鑒。
五、技術(shù)層面實(shí)現(xiàn)
這部分也是參考一些大神的博客得出的一些技術(shù)層面的心得,可能不是很恰當(dāng),希望大家指正。
1. 前端高并發(fā)
前端常用的方法是擴(kuò)容、靜態(tài)化、限流。
擴(kuò)容:
加機(jī)器,這是最簡單的方法,通過增加前端池的整體承載量來抗峰值。
舉個(gè)通俗的例子:
比如我想運(yùn)送100棵樹木,我準(zhǔn)備兩輛卡車,一輛運(yùn)50,計(jì)算公式就是2輛X50棵/輛X1小時(shí)=100棵/小時(shí)。
那如果我需要搬運(yùn)更多的樹木,我可以通過增加車輛、也可以增加每輛車的運(yùn)輸量、或者縮短運(yùn)輸時(shí)間。
這就是擴(kuò)容的概念。
靜態(tài)化:
將活動(dòng)頁面上的所有可以靜態(tài)的元素全部靜態(tài)化,并盡量減少動(dòng)態(tài)元素,通過CDN來抗峰值。
限流:
一般都會(huì)采用IP級(jí)別的限流,即針對(duì)某一個(gè)IP,限制單位時(shí)間內(nèi)發(fā)起請(qǐng)求數(shù)量;或者在活動(dòng)入口,增加游戲或者問題環(huán)節(jié)進(jìn)行消峰操作。
有損服務(wù):
最后一招,在接近前端池承載能力的水位上限的時(shí)候,隨機(jī)拒絕部分請(qǐng)求來保護(hù)活動(dòng)整體的可用性。
2. 后端如何解決
方案:本地標(biāo)記+redis預(yù)處理+RabbitMQ異步下單+客戶端輪詢。
實(shí)現(xiàn):
- 在秒殺階段使用本地標(biāo)記對(duì)用戶秒殺過的商品做標(biāo)記,若被標(biāo)記過直接返回重復(fù)秒殺,未被標(biāo)記才查詢r(jià)edis,通過本地標(biāo)記來減少對(duì)redis的訪問。
- 搶購開始前,將商品和庫存數(shù)據(jù)同步到redis中,所有的搶購操作都在redis中進(jìn)行處理,通過Redis預(yù)減少庫存減少數(shù)據(jù)庫訪問。
- 為了保護(hù)系統(tǒng)不受高流量的沖擊而導(dǎo)致系統(tǒng)崩潰的問題,使用RabbitMQ用異步隊(duì)列處理下單,實(shí)際做了一層緩沖保護(hù),做了一個(gè)窗口模型,窗口模型會(huì)實(shí)時(shí)的刷新用戶秒殺的狀態(tài)。
- client端用js輪詢一個(gè)接口,用來獲取處理狀態(tài)。
以上是自己對(duì)于設(shè)計(jì)秒殺系統(tǒng)的思路,不喜勿噴。
如果大家有更多的思路希望和我多多交流,不斷補(bǔ)充。
本文由 @琛琛 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自 Unsplash,基于 CC0 協(xié)議


