冪等性學(xué)習(xí)
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括林州網(wǎng)站建設(shè)、林州網(wǎng)站制作、林州網(wǎng)頁(yè)制作以及林州網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,林州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到林州省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
一:什么是冪等性
在這里需要有以下幾個(gè)問(wèn)題需要注意:
1:冪等性的實(shí)質(zhì)是一次或多次請(qǐng)求同一個(gè)資源,其結(jié)果是相同的。其關(guān)注的是對(duì)資源產(chǎn)生的影響(副作用)而不是結(jié)果,結(jié)果可以不同。比如列表查詢(xún)的時(shí)候,一邊在save或者是update,而你這邊還是在select,其結(jié)果肯定是不同的,但是你的select操作并未對(duì)數(shù)據(jù)(資源)產(chǎn)生影響(副作用);
2:冪等性不僅僅只是一次或者多次請(qǐng)求的時(shí)候?qū)Y源沒(méi)有副作用。比如根據(jù)id對(duì)數(shù)據(jù)庫(kù)的查詢(xún)操作,此操作對(duì)數(shù)據(jù)庫(kù)沒(méi)有增刪改,所以多次查詢(xún)操作對(duì)數(shù)據(jù)庫(kù)結(jié)果是沒(méi)有任何影響的;
3:冪等性還包括了第一次請(qǐng)求資源的時(shí)候,對(duì)資源產(chǎn)生了副作用,但是在以后多次同樣的請(qǐng)求操作的時(shí)候,都不會(huì)在對(duì)資源產(chǎn)生副作用了。比如我們根據(jù)id更新訂單狀態(tài)從支付中變?yōu)橹Ц锻瓿蛇@個(gè)操作,在執(zhí)行第一次的時(shí)候,會(huì)更新為支付完成。之后在根據(jù)這個(gè)id執(zhí)行此操作,無(wú)論執(zhí)行多少次其結(jié)果和第一次執(zhí)行后的結(jié)果一樣;
4:冪等性關(guān)注的是以后的多次請(qǐng)求是否對(duì)資源產(chǎn)生了副作用,而不是關(guān)注的結(jié)果;
5:需要說(shuō)明的是網(wǎng)絡(luò)超時(shí)、服務(wù)宕機(jī)等問(wèn)題,不是冪等的范圍。
冪等性是系統(tǒng)服務(wù)對(duì)外的一種承諾(注意,是一種承諾,而不是一種實(shí)現(xiàn)),接口服務(wù)提供方承諾只要調(diào)用接口成功了,外部多次調(diào)用對(duì)系統(tǒng)的影響是一致的。這里需要強(qiáng)調(diào)一點(diǎn)就是,聲明為冪等的服務(wù)會(huì)認(rèn)為調(diào)用方調(diào)用失敗是常態(tài),是正常業(yè)務(wù),并且允許在調(diào)用失敗后必然會(huì)有重試的。
來(lái)源:凱哥Java(kaigejava)
二:什么情況下需要使用冪等
????在我們開(kāi)發(fā)中,經(jīng)常會(huì)遇到一個(gè)頭疼的事情—重復(fù)提交的情況。重復(fù)提交情況有多種原因產(chǎn)生的。如由于網(wǎng)絡(luò)問(wèn)題無(wú)法收到請(qǐng)求結(jié)果情況下而重新發(fā)起的請(qǐng)求或者是因?yàn)檎{(diào)用方前端操作抖動(dòng)而造成的重復(fù)提交。
重復(fù)提交操作帶來(lái)的嚴(yán)重后果在交易系統(tǒng)、支付系統(tǒng)中因重復(fù)提交而產(chǎn)生的問(wèn)題尤其的明顯。如:我們發(fā)起支付的時(shí)候向支付寶支付請(qǐng)求,無(wú)論是交易系統(tǒng)自身bug還是交易系統(tǒng)與支付寶之間的網(wǎng)絡(luò)問(wèn)題導(dǎo)致重復(fù)發(fā)送,支付寶應(yīng)該并且必須只能扣用戶一次錢(qián)的。在這種需求下的系統(tǒng)在設(shè)計(jì)的時(shí)候,我們就需要將系統(tǒng)或者服務(wù)設(shè)計(jì)成冪等的。
三:冪等和防重復(fù)提交比較
重復(fù)提交:重復(fù)提交是在第一次請(qǐng)求成功的情況下,人為的進(jìn)行多次操作,從而導(dǎo)致不滿足冪等性要求的服務(wù)多次改變數(shù)據(jù)狀態(tài)。
冪等:更多使用的情況是第一次請(qǐng)求知道結(jié)果(比如常見(jiàn)的網(wǎng)絡(luò)抖動(dòng)導(dǎo)致連接超時(shí))或者失敗異常情況下,發(fā)起多次請(qǐng)求的,其目的是多次確認(rèn)第一次請(qǐng)求成功,卻不會(huì)因?yàn)槎啻握?qǐng)求而出現(xiàn)多次的狀態(tài)變化。
什么情況下需要保障冪等性?
在這里,我們以sql為例來(lái)講解。在下面三種場(chǎng)景中,只要第三種場(chǎng)景需要開(kāi)發(fā)人員使用其他策略來(lái)保障冪等性:
1:查詢(xún)情況
Select * from table where id = 2
無(wú)論執(zhí)行多少次都不會(huì)對(duì)資源造成副作用,所以可以說(shuō)是天然的冪等
2:根據(jù)id更新
Update table set status =1 where id =2
無(wú)論執(zhí)行成功多少次狀態(tài)都是一致的,第一次執(zhí)行成功對(duì)資源造成的副作用和多次執(zhí)行成功對(duì)數(shù)據(jù)造成的副作用是一樣的。因此可以說(shuō)這種場(chǎng)景也是冪等操作
3:不是冪等情況
Update table set version = version+1 where id = 2
每次執(zhí)行的結(jié)果都會(huì)發(fā)生變化,也就是說(shuō)對(duì)資源造成了副作用,這種不是冪等的。這種情況如果想要保證冪等,語(yǔ)句可以這么寫(xiě):update table set version = version+1 where id = 2 and version = 1.這樣就可以保證冪等了。
為什么要設(shè)計(jì)冪等性的服務(wù)?
冪等性的服務(wù)可以使得客戶端的處理業(yè)務(wù)邏輯變的簡(jiǎn)單了,但是確實(shí)以犧牲服務(wù)端邏輯變復(fù)雜為代價(jià)的。因?yàn)樵跐M足冪等服務(wù)的需求下邏輯至少需要包含以下兩點(diǎn):
1:首選去查詢(xún)上一次的執(zhí)行狀態(tài)(結(jié)果),如果沒(méi)有則認(rèn)為是第一次請(qǐng)求。這樣就增加了業(yè)務(wù)難度
2:在服務(wù)改變狀態(tài)的業(yè)務(wù)邏輯前,保證防重復(fù)提交的邏輯
冪等的不足:
通過(guò)上面我們知道了冪等服務(wù)是以犧牲服務(wù)提供者邏輯和成本為代價(jià)的。所以,是否有必要,需要根據(jù)具體場(chǎng)景具體來(lái)分析的。因此除了業(yè)務(wù)上的特殊要求外,盡量不要提供冪等的接口。
1:增加了額外的控制冪等的業(yè)務(wù)邏輯,復(fù)雜了業(yè)務(wù)功能;
2:把并行執(zhí)行的功能改為串行執(zhí)行,這樣就降低了執(zhí)行的效率。
保證冪等策略
其實(shí)在保證冪等的業(yè)務(wù)會(huì)通過(guò)唯一的業(yè)務(wù)單號(hào)來(lái)保證的。也就是說(shuō)相同的單號(hào),被認(rèn)為是同一筆業(yè)務(wù)。使用唯一的業(yè)務(wù)單號(hào)來(lái)確保,后面多次相同的業(yè)務(wù)單號(hào)的的處理邏輯和執(zhí)行兄啊過(guò)是一致的。我們以常見(jiàn)的支付為例(在不考慮并發(fā)情況下),實(shí)現(xiàn)冪等很簡(jiǎn)單:
1:先查詢(xún)一下訂單是否已經(jīng)支付過(guò)
2:如果已經(jīng)支付過(guò),則返回支付成功;如果沒(méi)有支付,在進(jìn)行支付流程操作后,將訂單狀態(tài)修改為已支付。
分享名稱(chēng):冪等性學(xué)習(xí)及接口的冪等性
文章網(wǎng)址:http://www.rwnh.cn/article24/jephce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、建站公司、網(wǎng)站設(shè)計(jì)、網(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)