
商城特殊活動(dòng)架構(gòu).png
特殊活動(dòng)構(gòu)成模塊
-
驗(yàn)證碼
-
產(chǎn)生驗(yàn)證碼
- 初始化產(chǎn)生100個(gè)驗(yàn)證碼,每次按照當(dāng)前時(shí)間ms%100獲取一個(gè)驗(yàn)證碼,保存至tair,超時(shí)為x分鐘
- 這里的校驗(yàn)碼類似于token,每次請(qǐng)求都隨機(jī)分配一個(gè)用戶唯一的token并且保存至tair,這個(gè)token還有圖片顯示給前端
- 用戶需要手動(dòng)輸入這個(gè)圖片里的驗(yàn)證碼
- 這樣秒殺拼的系統(tǒng)是(分流不至于單點(diǎn)壓力,提高機(jī)器人刷單行為成本)
- 用戶點(diǎn)擊秒殺按鈕的速度
- 快速識(shí)別驗(yàn)證碼和輸入驗(yàn)證碼的速度
- 校驗(yàn)驗(yàn)證碼
- 發(fā)獎(jiǎng)時(shí)要拿這個(gè)token對(duì)tair內(nèi)token進(jìn)行校驗(yàn)(覺得這個(gè)流程體驗(yàn)很不好)
- 應(yīng)該是token的生成和校驗(yàn)都是 代碼自動(dòng)做的,不需要額外的用戶交互
-
產(chǎn)生驗(yàn)證碼
-
活動(dòng)模塊信息(商品列表)
- 一個(gè)活動(dòng)下面包含多個(gè)模塊
- 秒殺品模塊,推薦品模塊(商品)[為了導(dǎo)流],其他模塊(主題商品館)[不一定需要],秒殺場(chǎng)次模塊時(shí)間表
- 包含的spu類型有, 優(yōu)惠券/實(shí)物
- 秒殺品應(yīng)該只是spu/sku的特殊類型,當(dāng)秒殺時(shí)間過期后,商品應(yīng)該自動(dòng)變?yōu)槠胀ǖ膕pu/sku(我們現(xiàn)在的系統(tǒng)并不是這樣的,而是單獨(dú)把秒殺品和非秒殺品的訂單流程分開,造成秒殺品訂單不可逆)
- 秒殺品只能是 b2c產(chǎn)品
- 秒殺品的庫(kù)存應(yīng)該是 spu下面的sku對(duì)應(yīng)總和,而我們的系統(tǒng)是將spu中的第一個(gè)sku作為賣品,而沒有將spu中不同規(guī)格商品進(jìn)行細(xì)分
-
秒商品列表模塊SPU庫(kù)存信息
- 單獨(dú)module 下 spu list 庫(kù)存信息查詢接口
- 批量獲取一個(gè)module 下所有spu 的庫(kù)存,保存至tair
-
獲取秒殺品詳情
- 商品信息(但是不顯示秒殺品剩余庫(kù)存信息)
-
準(zhǔn)備參與秒殺(京東\阿里的秒殺是不需要輸入驗(yàn)證碼)
- 獲取校驗(yàn)碼
- 正確輸入校驗(yàn)碼
-
參與秒殺
- 現(xiàn)有實(shí)現(xiàn)秒殺品到點(diǎn)前不允許搶購(gòu)
- 點(diǎn)擊搶購(gòu)后需要校驗(yàn) token,風(fēng)控 -> 扣減庫(kù)存 -> 記錄用戶令牌 -> 記錄用戶參與信息( 這里采用單向鏈表模型,向后自動(dòng)調(diào)用)
- toke 校驗(yàn),防止刷單,降低并發(fā)請(qǐng)求(就是一個(gè)驗(yàn)證碼)
- 風(fēng)控 判斷用戶userId/設(shè)備deviceId是否已經(jīng)參與過,用tair保存
- 扣取 庫(kù)存計(jì)數(shù)器 同時(shí)會(huì)將 spu 狀態(tài)也保存在tair中,如果庫(kù)存被扣完,則更新spu緩存狀態(tài),減少計(jì)數(shù)器壓力[這里由于采用@Cacheable的方法,無法立即更新,spu的狀態(tài)可能會(huì)需要本地緩存自動(dòng)更新]
- 發(fā)放用戶令牌 生成用戶唯一令牌
- 記錄用戶/設(shè)備記錄 防止用戶重復(fù)參與,15分鐘內(nèi)不允許再使用
-
創(chuàng)建秒殺訂單
- 我們將秒殺品下單獨(dú)立了一個(gè)判斷
- 秒殺品不允許使用 健康金/優(yōu)惠券/購(gòu)物卡(京東是允許使用)坑比[非秒殺品, 是可以調(diào)用促銷中心計(jì)算促銷后訂單金額]
- 正常下單后,對(duì)用戶進(jìn)行風(fēng)控(同一個(gè)設(shè)備,同一個(gè)用戶,同一個(gè)spu,同一天內(nèi),n分鐘內(nèi),只允許購(gòu)買n次)[比較合理的控制是,一個(gè)秒殺品,只允許用戶購(gòu)買n次]
- 由于采用同步調(diào)用創(chuàng)建訂單服務(wù),失敗有多種原因,如果由于庫(kù)存/商品不可用的原因,則立即清空緩存內(nèi)的庫(kù)存計(jì)數(shù)器。(這種原因是使用分桶策略,有可能有些分桶還存在庫(kù)存,但是總庫(kù)存已經(jīng)不足,這時(shí)候應(yīng)該馬上清空全部分桶庫(kù)存,同時(shí)將整個(gè)spu/sku置為不可用)
第三方組件選型
-
緩存 Spring-Cache管理
-
本地緩存 EhCache
- 場(chǎng)次產(chǎn)品信息緩存全量至本地 每隔 n分鐘, 重新從 db/第三方緩存 更新一次[這里面有n分鐘的管理信息同步問題]
- 可以做一個(gè)全局監(jiān)控,當(dāng)管理端刷新后,監(jiān)控觸發(fā)自動(dòng)更新本地緩存[我們還沒做這一個(gè)]
- 采用 spring 4.2.x,存在 expire 后穿透至第三方緩存問題
- 場(chǎng)次產(chǎn)品信息緩存全量至本地 每隔 n分鐘, 重新從 db/第三方緩存 更新一次[這里面有n分鐘的管理信息同步問題]
-
第三方緩存 Tair[支持持久化和非持久化]
- 持久化 重要數(shù)據(jù), 秒殺商品,庫(kù)存(保存總庫(kù)存/按策略分桶保存庫(kù)存)
- 非持久化
-
本地緩存 EhCache
-
MQ RocketMQ
- HessianUtils 對(duì)數(shù)據(jù)進(jìn)行壓縮
- 注意 consumer/producer 之間序列化Object的問題,package path不對(duì)無法匹配
特殊活動(dòng)應(yīng)用設(shè)計(jì)的內(nèi)容
-
場(chǎng)次+獎(jiǎng)品(商品/現(xiàn)金)=活動(dòng)
-
獎(jiǎng)品分為 商品,現(xiàn)金,優(yōu)惠券
- 獎(jiǎng)品 綁定場(chǎng)次,獎(jiǎng)品不能多個(gè)場(chǎng)次共用(個(gè)人覺得不合理),現(xiàn)有方案認(rèn)為運(yùn)營(yíng)的工作量能忍受,我個(gè)人覺得模型上有問題
- 獎(jiǎng)品 有時(shí)效性
- 我的理解,當(dāng)前獎(jiǎng)品的時(shí)效性和優(yōu)惠券的時(shí)效性沖突(如何確定真實(shí)時(shí)效性),但是實(shí)物(現(xiàn)金)又沒有時(shí)效性需要獎(jiǎng)品時(shí)間來控制(沒理解)。
- 業(yè)務(wù)的時(shí)效性 又被理解為活動(dòng)后臺(tái)允許獲取獎(jiǎng)品的時(shí)間段,細(xì)分了每個(gè)獎(jiǎng)品適用的范圍段
-
商品(spu)
- 實(shí)物
- 以抵用券的形式發(fā)放
- 虛擬物(具體的物品詳細(xì)到 sku)
- 主客優(yōu)惠券(使用) - 賣家承擔(dān)成本
- 話費(fèi)充值卡
- 流量充值卡
- 主客無門檻券 - 商城承擔(dān)成本
- 抵用券 協(xié)商商戶
- 實(shí)物
-
現(xiàn)金
- 需要獨(dú)立現(xiàn)金紅包系統(tǒng)
- 需要實(shí)現(xiàn) 賬本 等等實(shí)現(xiàn)
-
優(yōu)惠券
- 優(yōu)惠券系統(tǒng)
- 一個(gè)場(chǎng)次只會(huì)有一類優(yōu)惠券
-
獎(jiǎng)品分為 商品,現(xiàn)金,優(yōu)惠券