https://blog.csdn.net/qq_39291929/article/details/81429275(主內(nèi)容)
http://www.itdecent.cn/p/25f4b64e2068(token機(jī)制)
概念:對其任意次數(shù)的操作結(jié)果與一次操作的結(jié)果相同(不用擔(dān)心重復(fù)執(zhí)行會對系統(tǒng)造成改變)
業(yè)務(wù)場景:
1.綁定銀行卡發(fā)送短信接口。如果APP重復(fù)點擊調(diào)用后臺接口,后臺重復(fù)調(diào)用第三方接口,造成用戶收到多條短信,一般情況下控制在60s內(nèi)再重發(fā)短信,如果不做控制,每一次調(diào)用第三方接口都會收費(fèi)。
2.創(chuàng)建訂單接口。如果APP端因網(wǎng)絡(luò)問題用戶重復(fù)點擊多次,會生成多個訂單號,會造成系統(tǒng)業(yè)務(wù)問題。
解決方案:
冪等性解決方案
1.數(shù)據(jù)庫表加唯一索引,防止新增臟數(shù)據(jù)。比如對訂單號進(jìn)行加唯一索引,防止生成重復(fù)訂單。
如果不加索引的后果是:當(dāng)根據(jù)訂單號去支付,支付表生成兩條重復(fù)的訂單號,然后去支付寶、微信、易寶支付去支付,付款完成后,第三方異步回調(diào)接口,本地接口首先根據(jù)訂單號查詢實體,發(fā)現(xiàn)查詢到兩條,系統(tǒng)就會拋出異常。
2.分布式鎖
利用redis,在業(yè)務(wù)系統(tǒng)插入數(shù)據(jù)或者更新數(shù)據(jù),獲取分布式鎖,然后做操作,之后釋放鎖,這樣其實是把多線程并發(fā)的鎖的思路
3.token機(jī)制,防止重復(fù)提交
(1). 數(shù)據(jù)提交前要向服務(wù)的申請token,token放到redis中,token有效時間
(2). 提交后后臺校驗token,同時刪除token,生成新的token返回(http://www.itdecent.cn/p/25f4b64e2068)