- 今日推薦
-
- 淘寶客服kpi是什么意思怎么設(shè)置「電話客服kpi」
- 直播平臺(tái)流水造假「退款理由材質(zhì)造假有影響嗎」
- 什么是融資租賃融資租賃的業(yè)務(wù)模式及并購(gòu)方式的特點(diǎn)「融資租賃交易模式」
- b端產(chǎn)品的核心價(jià)值「b端設(shè)計(jì)師」
- 企業(yè)跨國(guó)經(jīng)營(yíng)過(guò)程中如何防范匯率風(fēng)險(xiǎn)「人民幣匯率對(duì)出口企業(yè)影響」
- 電子商務(wù)出口企業(yè)出口貨物退免稅政策「跨境貿(mào)易便利化措施」
- 電商客服激勵(lì)考核制度「電商客服主管kpi考核表」
- 合伙做跨境電商「合伙做電商」
- 客服外包前景「客服外包服務(wù)商」
- 電商毀了實(shí)體店「電商搞垮實(shí)體店」
- 特別關(guān)注
-
- 電商在什么情況下選擇客服外包才是正確的時(shí)機(jī)「電商外包客服如何開(kāi)展業(yè)務(wù)」
- 電商管理層如何分配合理「團(tuán)隊(duì)組建方案」
- 淘寶客服管理制度「淘寶客服基本工作流程包括」
- 熱搜第一淘寶崩了「成為淘寶熱搜詞」
- 電商外包客服好不好「網(wǎng)店客服外包靠譜嗎」
- KPI考核什么意思「職場(chǎng)必須懂的社會(huì)常識(shí)」
- 客服外包公司什么意思「電話客服kpi」
- 客服外包:電商行業(yè)發(fā)展下的必然趨勢(shì)「現(xiàn)在的客服都是外包的嗎」
- 熱搜第一:淘寶崩了!最新回應(yīng)來(lái)了「淘寶最近出了什么事」
- u型牙刷選salove深?lèi)?ài)「卡斯麗牙刷」
- 熱門(mén)點(diǎn)擊
-
- 高考多少分才能上浙江大學(xué)「要考浙江大學(xué)的各科分?jǐn)?shù)要多少」
- 淘寶崩了熱搜第一「如何看淘寶近期熱搜」
- 淘寶崩了!\\「淘寶崩潰了怎么回事」
- 字節(jié)跳動(dòng)第一款社交產(chǎn)品「小眾社交」
- 電商對(duì)地方經(jīng)濟(jì)的危害「電商對(duì)國(guó)家的危害」
- 拼多多驗(yàn)真假「拼多多顯示拼了10萬(wàn)但是沒(méi)什么評(píng)論」
- 熱搜第一:淘寶崩了「淘寶最近出了什么事」
- 餉店怎么代理「怎么開(kāi)餉店」
- 優(yōu)選平臺(tái)供應(yīng)商「匯聚優(yōu)選」
- 亞馬遜怎么選品分析「亞馬遜選品考慮因素有哪些」
電商防止訂單重復(fù)提交「下單頻繁怎么破解」
我們從用戶(hù)瀏覽商品開(kāi)始,看看用戶(hù)下單的簡(jiǎn)要過(guò)程:
用戶(hù)下單簡(jiǎn)要過(guò)程
瀏覽商品:用戶(hù)查看商品詳情加購(gòu)/結(jié)算:用戶(hù)可以選擇直接購(gòu)買(mǎi)商品,也可以先加入購(gòu)物車(chē),用戶(hù)購(gòu)買(mǎi)的這一步就是結(jié)算確認(rèn)下單:結(jié)算完成,就進(jìn)入了下單頁(yè)面,提交訂單,這一步就會(huì)生成一個(gè)訂單,然后進(jìn)入付款頁(yè)面我們可以看到,下單是發(fā)生在結(jié)算之后,下單之后,會(huì)生成唯一的訂單號(hào),接下來(lái),客戶(hù)端需要用這個(gè)訂單號(hào)去完成支付。
那接下來(lái)先看看,為什么發(fā)生重復(fù)下單?
為什么會(huì)重復(fù)下單為什么會(huì)重復(fù)下單,對(duì)于訂單服務(wù)而言,就是接到了多個(gè)下單的請(qǐng)求,原因可能有很多,最常見(jiàn)的是這兩種:
用戶(hù)重復(fù)提交網(wǎng)絡(luò)原因?qū)е碌某瑫r(shí)重試重復(fù)下單原因
如何防止重復(fù)下單防止用戶(hù)提交,最常規(guī)的做法,就是客戶(hù)端點(diǎn)擊下單之后,在收到服務(wù)端響應(yīng)之前,按鈕置灰。
當(dāng)然,防止重復(fù)下單,肯定不能只依靠客戶(hù)端,可能會(huì)因?yàn)橐恍┚W(wǎng)絡(luò)的抖動(dòng),導(dǎo)致仍然有重復(fù)的請(qǐng)求到達(dá)服務(wù)端,所以還是要在服務(wù)端做防重/冪等的處理。
PS:這里額外插入一點(diǎn)我對(duì)防重和冪等的理解:防重指的是防止重復(fù)提交,冪等指的是多次請(qǐng)求如一次,簡(jiǎn)單說(shuō),就是防重可以給對(duì)重復(fù)請(qǐng)求拋異常,冪等是對(duì)重復(fù)的請(qǐng)求響應(yīng)第一次的結(jié)果,在我們討論的這個(gè)場(chǎng)景里,冪等就是響應(yīng)唯一的訂單號(hào)。
防重和冪等
防重第一步,需要識(shí)別請(qǐng)求是否重復(fù),這一步,需要客戶(hù)端配合實(shí)現(xiàn)。
為什么呢?大家想一下,下單的時(shí)候,服務(wù)端怎么去判斷這個(gè)下單請(qǐng)求是否唯一呢?金額?商品??jī)?yōu)惠券?……萬(wàn)一用戶(hù)就是喜歡,又下了一個(gè)一模一樣的單呢?
所以,需要客戶(hù)端在請(qǐng)求下單接口的時(shí)候,需要生成一個(gè)唯一的請(qǐng)求號(hào):requestId,服務(wù)端拿這個(gè)請(qǐng)求號(hào),判斷是否重復(fù)請(qǐng)求。
那么,接下來(lái),壓力就給到服務(wù)端了,看看服務(wù)端怎么實(shí)現(xiàn)防重/冪等吧!
利用數(shù)據(jù)庫(kù)實(shí)現(xiàn)冪等可以在訂單表t_order里添加一個(gè)字段:requestId,添加唯一索引:
唯一請(qǐng)求字段
這樣一來(lái),如果是重復(fù)的請(qǐng)求,在落庫(kù)的時(shí)候就會(huì)報(bào)錯(cuò),為了保證冪等性,我們可以catch住這個(gè)異常,根據(jù)requestId獲取訂單號(hào),然后向客戶(hù)端響應(yīng)訂單號(hào)。
大概的代碼如下:
PlaceOrderResVO placeOrder(PlaceOrderReqVO reqVO) { try { //下單業(yè)務(wù)邏輯 …… //生成訂單號(hào) String oid=generateOid(); …… //訂單落庫(kù) Order order = orderMapper.saveOrder(orderDO); //響應(yīng)訂單 resVO.setOid(order.getOid()); return resVO; } catch(UniqueKeyViolationException e) { // 發(fā)生了重復(fù)異常 // 根據(jù)請(qǐng)求號(hào)獲取訂單 Order order = getOrderByRequestId(reqVO.getRequestId()); resVO.setOid(order.getOid()); return resVO; } catch (Exception e) { }}當(dāng)然,這里不太好的地方是,拿異常來(lái)做業(yè)務(wù)判斷。
利用Redis防重另外一個(gè)辦法,就是下單請(qǐng)求的時(shí)候要加鎖了,通常我們的服務(wù)都是集群部署,所以一般都是用Redis實(shí)現(xiàn)分布式鎖。
大概的邏輯:
就是以requestId為維度,進(jìn)行加鎖,如果獲取鎖失敗,就拋一個(gè)自定義的重復(fù)下單異常。如果獲取到鎖,先check一下,是否已經(jīng)下單,為了提高性能,下單完成后,也把下單的結(jié)果放在Redis緩存里。redis防重邏輯
大概的代碼如下:
public PlaceOrderResVO placeOrder(PlaceOrderReqVO reqVO) { //加鎖 RLock orderLock = redissonClient.getLock(RedisConstant.PLACE_ORDER_LOCK_KEY reqVO.getRequestId()); //獲取鎖失敗,拋出重復(fù)下單異常 if(orderLock.isExistes){ throw new OrderRepeatException(); } // 加鎖 orderLock.lock(); try { //檢查是否已經(jīng)下單 RBucket<PlaceOrderResVO> orderCache = redissonClient.getBucket(RedisConstant.PLACE_ORDER_LOCK_KEY reqVO.getRequestId()); if(orderCache.isExistes){ return orderCache.get(); } //下單業(yè)務(wù)邏輯 …… //落庫(kù) //訂單落庫(kù) Order order = orderMapper.saveOrder(orderDO); …… //緩存結(jié)果 orderCache.put(resVO); return resVO; } } catch (Exception e) { //…… } finally { orderLock.unlock(); } return resVO; }這里再說(shuō)明一下:
為什么獲取不到鎖的時(shí)候要拋異常呢?因?yàn)橄聠卫锩嫫鋵?shí)還有一些其它的業(yè)務(wù)流程,比如鎖庫(kù)存、清優(yōu)惠券……而此時(shí),獲取到鎖的請(qǐng)求的下單流程還沒(méi)有結(jié)束,下單的結(jié)果還獲取不到,沒(méi)法完成響應(yīng),也就沒(méi)辦法做冪等。
客戶(hù)端,也可以根據(jù)響應(yīng)的狀態(tài)碼,進(jìn)行特殊處理,比如這個(gè)異常先不提示,但是允許用戶(hù)再次點(diǎn)擊下單按鈕,來(lái)提升用戶(hù)的體驗(yàn)。
原文鏈接:https://mp.weixin.qq.com/s/Dc_4taB6Boojdw_0mngroQ
作者:三分惡
相關(guān)文章
- \\「你的事業(yè)」
- 電商平臺(tái)的白酒為什么這么便宜「淘寶網(wǎng)上的白酒怎么那么便宜」
- oem定制酒「酒的水貨和公司貨」
- 為什么很多商家喜歡小程序商城的分銷(xiāo)模式「小程序商城的分銷(xiāo)模式」
- 酒類(lèi)市場(chǎng)份額「2017年gdp」
- 為什么所有平臺(tái)都想帶貨「為什么要直播帶貨」
- 蘇寧和京東搶茅臺(tái)「五糧液夢(mèng)之藍(lán)茅臺(tái)對(duì)比」
- 黎川精準(zhǔn)扶貧引領(lǐng)致富路線「做好精準(zhǔn)扶貧工作必須增強(qiáng)導(dǎo)向引領(lǐng)」
- 開(kāi)發(fā)電商平臺(tái)的意義「有意義的社交」
- 社群營(yíng)銷(xiāo)屬于哪個(gè)領(lǐng)域「社域有限公司」
- 雙十一醫(yī)藥電商「買(mǎi)東西花錢(qián)的說(shuō)說(shuō)」
- 電商購(gòu)物狂歡節(jié)「雙十一購(gòu)物狂歡節(jié)」
- 電商過(guò)年有沒(méi)有活動(dòng)「什么是電商單號(hào)」
- 電商狂歡節(jié)「電商雙十一」
- 跨境電商獨(dú)立站發(fā)展前景怎么樣「跨境電商重要性」
- \\「了解惠州從今日惠州網(wǎng)開(kāi)始」
- 揭秘錢(qián)大媽:如何靠賣(mài)豬肉賣(mài)出近百億估值「錢(qián)大媽公司股票」
- 沃爾瑪生鮮占比「錢(qián)大媽生鮮超市經(jīng)營(yíng)模式」