成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

冪等的實現(xiàn)方案

NikoManiac / 3436人閱讀

摘要:冪等實現(xiàn)方案冪等性不能脫離業(yè)務(wù)來討論。在不同的需求場景下,實現(xiàn)冪等的思路和方案也會不同,一般有如下通用方案多版本并發(fā)控制這是樂觀鎖的一種實現(xiàn),用于在數(shù)據(jù)庫并發(fā)訪問時的情況。去重表這是利用數(shù)據(jù)庫表單的特性來實現(xiàn)冪等。

背景

在軟件系統(tǒng)的開發(fā)過程中,我們可能有如下需求:

創(chuàng)建業(yè)務(wù)訂單,一次業(yè)務(wù)請求只能創(chuàng)建一個;

單個訂單請求調(diào)用支付接口,當遇到網(wǎng)絡(luò)或系統(tǒng)故障請求重發(fā),也應(yīng)該只支付一次;

單個訂單完成時,給用戶發(fā)送消息應(yīng)該只發(fā)一次;

等等很多情況下,都需要冪等的特性來支持。

冪等的概念

冪等(idempotence)一詞原為數(shù)學(xué)上的概念,用一個最直觀的數(shù)學(xué)式子表達為:

f(f(x)) = f(x)

對應(yīng)到軟件開發(fā)領(lǐng)域,即為同樣的請求被執(zhí)行一次與連續(xù)執(zhí)行多次的效果是一樣的,服務(wù)器的狀態(tài)也是一樣的,實際上就是接口的可重復(fù)調(diào)用(包括時間和空間上兩個維度)。
不是要求返回值完全相同,而且是指后續(xù)多余的調(diào)用對系統(tǒng)的數(shù)據(jù)一致性不造成破壞。對于寫入類操作,如果第一次寫入是成功的,后續(xù)的寫入應(yīng)該拋出異?;蛘呖詹僮?,或者執(zhí)行了寫入但是未對數(shù)據(jù)造成變化。對于讀取類操作,需要保證其實現(xiàn)上是真正的讀取,不能在讀操作中夾帶寫操作。

冪等實現(xiàn)方案

冪等性不能脫離業(yè)務(wù)來討論。
在不同的需求場景下,實現(xiàn)冪等的思路和方案也會不同,一般有如下通用方案:

1. MVCC(多版本并發(fā)控制)

這是樂觀鎖的一種實現(xiàn),用于在數(shù)據(jù)庫并發(fā)訪問時的情況。當數(shù)據(jù)更新時需要去判斷版本號是否一致,如果不一致,則無法對數(shù)據(jù)進行更新。例如請求支付接口進行扣款時:

update table_name set deposit = deposit-#{payment}, version = version + 1 where orderId = #{orderId} and version = #{version}

這里orderId可進一步設(shè)為主鍵或唯一索引,因為這樣是行鎖,否則更新操作時會鎖表。樂觀鎖在對已有數(shù)據(jù)進行更新時既能保證效率,又能保證冪等。

2. 去重表

這是利用數(shù)據(jù)庫表單的特性來實現(xiàn)冪等。以訂單請求支付場景為例:
將訂單號orderId設(shè)為去重表的唯一索引,每次請求支付都根據(jù)訂單號向去重表中插入一條數(shù)據(jù),只有插入成功才繼續(xù)執(zhí)行支付操作,相當于在事務(wù)的開始階段加鎖。
考慮兩種失敗的情況:

Insert去重表失敗,事務(wù)回滾,無任何影響;

Insert去重表成功,支付業(yè)務(wù)操作失敗,事務(wù)回滾,刪除之前插入去重表的記錄,無任何影響;

以上兩種失敗的情況下,事務(wù)的冪等性是可以保持的,避免了單個訂單同時多次進行支付的情況。
下圖為該支付場景下的時序圖:

3. 分布式鎖

與去重表思路相同,只是將對數(shù)據(jù)庫的的訪問轉(zhuǎn)移到了對緩存(如redis)的訪問,提高了效率。具體操作如下:
訂單發(fā)起支付請求,支付系統(tǒng)會去redis緩存中查詢是否存在該訂單號orderId的key,如果不存在,則向redis增加key為訂單號,然后開始實際支付操作;如果查詢到存在該訂單號的key,則不進行實際支付操作。無論支付操作成功或失敗,在支付操作結(jié)果返回后,在緩存中刪除該訂單號key。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76621.html

相關(guān)文章

  • 分布式冪等問題解決方案三部曲

    摘要:解決冪等問題的三部曲,也是作者的思考框架。這是解決冪等問題的第二部曲列出并減少副作用的分析維度。所以在并發(fā)執(zhí)行的維度,將并發(fā)重復(fù)執(zhí)行變成串行重復(fù)執(zhí)行是最好的冪等解決方案。 綱要 文章目的:本文旨在提煉一套分布式冪等問題的思考框架,而非解決某個具體的分布式冪等問題。在這個框架體系內(nèi),會有一些方案舉例說明。文章目標:希望讀者能通過這套思考框架設(shè)計出符合自己業(yè)務(wù)的完備的冪等解決方案。文章內(nèi)容...

    mumumu 評論0 收藏0
  • 【Java】幾道常見的秋招面試題

    摘要:總結(jié)的時間復(fù)雜度是,是空間是使用輔助棧來存儲最小值。項目就是為了解決配置繁瑣的問題,最大化的實現(xiàn)約定大于配置。 前言 只有光頭才能變強 Redis目前還在看,今天來分享一下我在秋招看過(遇到)的一些面試題(相對比較常見的) 0、final關(guān)鍵字 簡要說一下final關(guān)鍵字,final可以用來修飾什么? 這題我是在真實的面試中遇到的,當時答得不太好,現(xiàn)在來整理一下吧。 final可以修飾...

    Rocko 評論0 收藏0
  • 翻譯連載 | JavaScript 輕量級函數(shù)式編程-第5章:減少副作用 |《你不知道的JS》姊妹篇

    摘要:函數(shù)式編程者并沒有消除所有的副作用。我的結(jié)論是這里的并不違反減少或避免副作用的精神。一些語言允許你指定生成隨機數(shù)的種子。因此,我們必須將內(nèi)建的隨機數(shù)生成視為不純的一方。其他的錯誤在程序運行期間副作用可能導(dǎo)致的錯誤是多種多樣的。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌...

    yeyan1996 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<