欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何防訂單重復(fù)提交策略

這篇文章給大家分享的是有關(guān)如何防訂單重復(fù)提交策略的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

專注于為中小企業(yè)提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)邢臺(tái)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

背景

在業(yè)務(wù)開(kāi)發(fā)中,我們常會(huì)面對(duì)防止重復(fù)請(qǐng)求的問(wèn)題。當(dāng)服務(wù)端對(duì)于請(qǐng)求的響應(yīng)涉及數(shù)據(jù)的修改,或狀態(tài)的變更時(shí),可能會(huì)造成極大的危害。重復(fù)請(qǐng)求的后果在交易系統(tǒng)、售后維權(quán),以及支付系統(tǒng)中尤其嚴(yán)重。

前臺(tái)操作的抖動(dòng),快速操作,網(wǎng)絡(luò)通信或者后端響應(yīng)慢,都會(huì)增加后端重復(fù)處理的概率。前臺(tái)操作去抖動(dòng)和防快速操作的措施,我們首先會(huì)想到在前端做一層控制。當(dāng)前端觸發(fā)操作時(shí),或彈出確認(rèn)界面,或disable入口并倒計(jì)時(shí)等等,此處不細(xì)表。但前端的限制僅能解決少部分問(wèn)題,且不夠徹底,后端自有的防重復(fù)處理措施必不可少,義不容辭。

在接口實(shí)現(xiàn)中,我們常要求接口要滿足冪等性,來(lái)保證多次重復(fù)請(qǐng)求時(shí)只有一次有效。

查詢類的接口幾乎總是冪等的,但在包含諸如數(shù)據(jù)插入,多模塊數(shù)據(jù)更新時(shí),達(dá)到冪等性會(huì)比較難,尤其是高并發(fā)時(shí)的冪等性要求。比如第三方支付前臺(tái)回調(diào)和后臺(tái)回調(diào),第三方支付批量回調(diào),慢性能業(yè)務(wù)邏輯(如用戶提交退款申請(qǐng),商家同意退貨/退款等)或慢網(wǎng)絡(luò)環(huán)境時(shí),是重復(fù)處理的高發(fā)場(chǎng)景。

嘗試

這里針對(duì)“用戶提交退款申請(qǐng)”的例子,說(shuō)明一下嘗試過(guò)的防重復(fù)處理方法的效果。后端防重復(fù)處理的方式,我們先后嘗試了三種:

(1)基于DB中退款訂單狀態(tài)的驗(yàn)證

這種方式簡(jiǎn)單直觀,從DB查詢出來(lái)的退款詳情(包括狀態(tài))往往還可以用在后續(xù)邏輯中,沒(méi)有花額外的工作專門(mén)應(yīng)對(duì)重復(fù)請(qǐng)求的問(wèn)題。

這種查詢狀態(tài)后進(jìn)行驗(yàn)證的邏輯,從代碼上線后就一直存在于所有含狀態(tài)的業(yè)務(wù)邏輯處理中,必不可少。但對(duì)于防重復(fù)處理效果并不好:在前端添加防重復(fù)提交前,每周平均在25筆;前端優(yōu)化后,每周降到7筆。這個(gè)數(shù)量占總退款申請(qǐng)數(shù)的3%%,一個(gè)仍然無(wú)法接受的比例。

理論上,任意次請(qǐng)求只要在數(shù)據(jù)狀態(tài)更新之前都完成了查詢操作,則業(yè)務(wù)邏輯的重復(fù)處理就會(huì)發(fā)生。如下圖所示。優(yōu)化的方向是減少查詢到更新之間業(yè)務(wù)處理時(shí)間,可降低空檔期的并發(fā)影響。極致情況下如果查詢和更新變成了原子操作,則就不存在我們當(dāng)前的問(wèn)題。

如何防訂單重復(fù)提交策略

(2)基于緩存數(shù)據(jù)狀態(tài)的驗(yàn)證

redis存儲(chǔ)查詢輕量快速。在request進(jìn)來(lái)的時(shí)候,可以先記錄在緩存中。后續(xù)進(jìn)來(lái)的request每次進(jìn)行驗(yàn)證。整個(gè)流程處理完成,清除緩存。以退款為例子:

  • I. 每次退款發(fā)起申請(qǐng),讀取緩存中是否有以orderId為key的值
  • II. 沒(méi)有,則往緩存中寫(xiě)入以orderId為key的value
  • III.有,則說(shuō)明有該訂單的退款正在進(jìn)行。
  • IV. 操作完清緩存,或者緩存存值的時(shí)候設(shè)置生命周期

與1)的發(fā)放相比,數(shù)據(jù)庫(kù)換成響應(yīng)更快的緩存。但是仍然不是原子操作。插入和讀取緩存還是有時(shí)間間隔。在極致的情況下還是存在重復(fù)操作的情況。此方法優(yōu)化后,每周1筆重復(fù)操作。

如何防訂單重復(fù)提交策略

(3)利用唯一索引機(jī)制的驗(yàn)證

需要原子性操作,想到了數(shù)據(jù)庫(kù)的唯一索引。新建一個(gè)TradeLock表:

CREATE TABLE `TradeLock` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`type` int(11) NOT NULL COMMENT '鎖類型',
`lockId` int(11) NOT NULL DEFAULT '0' COMMENT '業(yè)務(wù)ID',
`status` int(11) NOT NULL DEFAULT '0' COMMENT '鎖狀態(tài)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='Trade鎖機(jī)制';

● 每次request進(jìn)來(lái)則往表里面插入數(shù)據(jù):

成功,則可以繼續(xù)操作(相當(dāng)于獲取鎖);
失敗,則說(shuō)明有操作在進(jìn)行。

● 操作完成后,刪除此條記錄。(相當(dāng)于釋放鎖)。

目前已經(jīng)上線,等待下周的數(shù)據(jù)統(tǒng)計(jì)。

如何防訂單重復(fù)提交策略

(4)基于緩存的計(jì)數(shù)器驗(yàn)證

由于數(shù)據(jù)庫(kù)的操作比較消耗性能,了解到redis的計(jì)數(shù)器也是原子性操作。果斷采用計(jì)數(shù)器。既可以提高性能,還不用存儲(chǔ),而且能提升qps的峰值。

還是以訂單退款為例子:

● 每次request進(jìn)來(lái)則新建一個(gè)以orderId為key的計(jì)數(shù)器,然后+1。

如果>1(不能獲得鎖): 說(shuō)明有操作在進(jìn)行,刪除。
如果=1(獲得鎖): 可以操作。

● 操作結(jié)束(刪除鎖):刪除這個(gè)計(jì)數(shù)器。

要了解計(jì)數(shù)器,可以參考:http://www.redis.cn/commands/incr.html

如何防訂單重復(fù)提交策略

總結(jié):

PHP語(yǔ)言自身沒(méi)有提供進(jìn)程互斥和鎖定機(jī)制。因此才有了我們上面的嘗試。網(wǎng)上也有文件鎖機(jī)制,但是考慮到我們的分布式部署,建議還是用緩存。在大并發(fā)的情況下,程序各種情況的發(fā)生。特別是涉及到金額操作,不能有一分一毫的差距。所以在大并發(fā)要互斥的情況下可以考慮3、4兩種方案。

愛(ài)迪生嘗試了1600多種材料選擇了鎢絲發(fā)明了燈泡,實(shí)踐出真知。遇到問(wèn)題,和問(wèn)題斗爭(zhēng),最后解決問(wèn)題是一個(gè)最大提升自我的過(guò)程,不但加寬自己的知識(shí)廣度,更加深了自己的技能深度。達(dá)到目標(biāo)之后的成就感更是不言而喻。

感謝各位的閱讀!關(guān)于如何防訂單重復(fù)提交策略就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

文章名稱:如何防訂單重復(fù)提交策略
分享網(wǎng)址:http://www.chinadenli.net/article46/ihochg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站App開(kāi)發(fā)定制網(wǎng)站網(wǎng)站內(nèi)鏈網(wǎng)站收錄品牌網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化