久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

再談冪等機(jī)制

 xkl135 2018-06-15


Java雜記
 

 

一,、什么是冪等性,?

冪等性(Idempotence)。在HTTP/1.1規(guī)范中冪等性的定義是:

Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.

冪等性:就是用戶對(duì)于同一操作發(fā)起的一次請(qǐng)求或者多次請(qǐng)求的結(jié)果是一致的,,不會(huì)因?yàn)槎啻吸c(diǎn)擊而產(chǎn)生了副作用,。

二、為什么需要冪等

那么我們?yōu)槭裁葱枰涌诰哂袃绲刃阅??設(shè)想一下以下情形:

  • 在App中下訂單的時(shí)候,,點(diǎn)擊確認(rèn)之后,沒(méi)反應(yīng),,就又點(diǎn)擊了幾次,。在這種情況下,如果無(wú)法保證該接口的冪等性,,那么將會(huì)出現(xiàn)重復(fù)下單問(wèn)題,。

  • 在接收消息的時(shí)候,,消息推送重復(fù)。如果處理消息的接口無(wú)法保證冪等,,那么重復(fù)消費(fèi)消息產(chǎn)生的影響可能會(huì)非常大,。

在分布式環(huán)境中,網(wǎng)絡(luò)環(huán)境更加復(fù)雜,,因前端操作抖動(dòng),、網(wǎng)絡(luò)故障、消息重復(fù),、響應(yīng)速度慢等原因,,對(duì)接口的重復(fù)調(diào)用概率會(huì)比集中式環(huán)境下更大,尤其是重復(fù)消息在分布式環(huán)境中很難避免,。

三,、如何保證接口的冪等性

接口的冪等性實(shí)際上就是接口可重復(fù)調(diào)用,在調(diào)用方多次調(diào)用的情況下,,接口最終得到的結(jié)果是一致的,。有些接口可以天然的實(shí)現(xiàn)冪等性,比如查詢接口,,對(duì)于查詢來(lái)說(shuō),,你查詢一次和兩次,對(duì)于系統(tǒng)來(lái)說(shuō),,沒(méi)有任何影響,,查出的結(jié)果也是一樣。

除了查詢功能具有天然的冪等性之外,,增加,、更新、刪除都要保證冪等性,。那么如何來(lái)保證冪等性呢,?

3.1保證冪等策略

冪等需要通過(guò)唯一的業(yè)務(wù)單號(hào)來(lái)保證。也就是說(shuō)相同的業(yè)務(wù)單號(hào),,認(rèn)為是同一筆業(yè)務(wù),。使用這個(gè)唯一的業(yè)務(wù)單號(hào)來(lái)確保,后面多次的相同的業(yè)務(wù)單號(hào)的處理邏輯和執(zhí)行效果是一致的,。
下面以支付為例,,在不考慮并發(fā)的情況下,實(shí)現(xiàn)冪等很簡(jiǎn)單:①先查詢一下訂單是否已經(jīng)支付過(guò),,②如果已經(jīng)支付過(guò),,則返回支付成功;如果沒(méi)有支付,進(jìn)行支付流程,,修改訂單狀態(tài)為‘已支付’,。

3.2防重復(fù)提交策略

上述的保證冪等方案是分成兩步的,第②步依賴第①步的查詢結(jié)果,,無(wú)法保證原子性的,。在高并發(fā)下就會(huì)出現(xiàn)下面的情況:第二次請(qǐng)求在第一次請(qǐng)求第②步訂單狀態(tài)還沒(méi)有修改為‘已支付狀態(tài)’的情況下到來(lái)。既然得出了這個(gè)結(jié)論,,余下的問(wèn)題也就變得簡(jiǎn)單:把查詢和變更狀態(tài)操作加鎖,,將并行操作改為串行操作。

列舉三種改進(jìn)方式:

1,、悲觀鎖,,select for update,整個(gè)執(zhí)行過(guò)程中鎖定該訂單對(duì)應(yīng)的記錄,。

2,、樂(lè)觀鎖,affectrows = db.update(“update payorder set state=’已支付’ where orderid=$orderid and state=’未支付’ “),,如果affectrows=1,,執(zhí)行充值,否則返回已處理,。

3,、定義防重復(fù)表,,orderid為unique key或者primary key,,執(zhí)行前,先insert,若insert成功則執(zhí)行充值,否則返回已處理

四,、總結(jié)

業(yè)務(wù)層設(shè)計(jì)協(xié)議時(shí),,要求請(qǐng)求方定義不重復(fù)的業(yè)務(wù)流水號(hào)。應(yīng)用實(shí)現(xiàn)時(shí),,利用數(shù)據(jù)庫(kù)樂(lè)觀鎖、插入unique key的日志等方式保證并發(fā)時(shí)的冪等。

冪等性把關(guān)環(huán)節(jié),,在協(xié)議設(shè)計(jì)評(píng)審中,評(píng)審重要業(yè)務(wù)RPC或者h(yuǎn)ttp接口是否支持冪等,,代碼評(píng)審中,,重點(diǎn)把關(guān)請(qǐng)求并發(fā)時(shí),是否仍舊能夠保證冪等性,。設(shè)計(jì)人員和具體實(shí)現(xiàn)人員在實(shí)現(xiàn)過(guò)程中,,也應(yīng)該時(shí)刻自審冪等性的實(shí)現(xiàn)是否過(guò)關(guān)。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多