1.冪等性
所謂冪等性,就是說(shuō)一個(gè)接口匪补,多次發(fā)起同一個(gè)請(qǐng)求伞辛,你這個(gè)接口得保證結(jié)果是準(zhǔn)確的烂翰,比如不能多扣款,不能多插入一條數(shù)據(jù)蚤氏,不能將統(tǒng)計(jì)值多加了1甘耿。這就是冪等性。
2.如何保證冪等性
①對(duì)于每個(gè)請(qǐng)求必須有一個(gè)唯一的標(biāo)志竿滨,比如訂單支付請(qǐng)求佳恬,必須要包含訂單的id,一個(gè)id只能支付一次于游。
②每次處理完請(qǐng)求之后毁葱,必須要有一個(gè)記錄標(biāo)識(shí)這個(gè)請(qǐng)求已經(jīng)處理過(guò)了,比如最常見(jiàn)的是在mysql中記錄一個(gè)狀態(tài)贰剥,比如支付前先插入一條這個(gè)訂單的支付流水倾剿,而且支付流水采用唯一約束,只有插入成功才進(jìn)行支付鸠澈。
③每次接受到請(qǐng)求之后需要先判斷之前是否已經(jīng)處理過(guò)柱告,比如一條訂單已經(jīng)支付了截驮,那么就一定會(huì)有支付流水笑陈,如果存在就表示已經(jīng)支付過(guò)了。
在實(shí)際操作中葵袭,可以結(jié)合自己的業(yè)務(wù)涵妥,比如說(shuō)用redis用orderId作為唯一鍵。只有成功插入這個(gè)支付流水坡锡,才可以執(zhí)行實(shí)際的支付扣款蓬网。你就可以寫一個(gè)標(biāo)識(shí)到redis里面去,set order_id payed鹉勒,下一次重復(fù)請(qǐng)求過(guò)來(lái)了帆锋,先查redis的order_id對(duì)應(yīng)的value,如果是payed就說(shuō)明已經(jīng)支付過(guò)了禽额,你就別重復(fù)支付了锯厢。