一,、什么是冪等性,?冪等性(Idempotence)。在HTTP/1.1規(guī)范中冪等性的定義是:
冪等性:就是用戶對(duì)于同一操作發(fā)起的一次請(qǐng)求或者多次請(qǐng)求的結(jié)果是一致的,,不會(huì)因?yàn)槎啻吸c(diǎn)擊而產(chǎn)生了副作用,。 二、為什么需要冪等那么我們?yōu)槭裁葱枰涌诰哂袃绲刃阅??設(shè)想一下以下情形:
在分布式環(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í)行效果是一致的,。 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)方式:
四,、總結(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)。 |
|