聊聊冪等

什么是冪等(idempotency)?簡單一點說宋下,一個操作如果具有任意多次執(zhí)行所產(chǎn)生的影響與一次執(zhí)行產(chǎn)生的影響相同,就是冪等辑莫。

這樣來說学歧,似乎也很容易理解。但是要知道摆昧,這樣的定義撩满,其實是一個語義范疇內(nèi)對行為結(jié)果的定義。如果用語法和規(guī)則去確保行為能達(dá)到這個結(jié)果,往往需要很謹(jǐn)慎的設(shè)計與實現(xiàn)伺帘。在系統(tǒng)中昭躺,冪等是一個很重要的概念。無論是在大型的互聯(lián)網(wǎng)系統(tǒng)還是企業(yè)級應(yīng)用伪嫁,REST API都被廣泛使用领炫。而正確的使用冪等,是API技術(shù)中極其重要的一個技術(shù)點张咳。

為什么說非常重要帝洪?日常生活中,支付是最常見的交易場景脚猾。比如我們在給支付寶發(fā)送一筆付款請求時葱峡,正常情況下,用戶扣款成功龙助,支付寶返回支付成功的信息砰奕。但是如果發(fā)生異常怎么辦?比如客戶端發(fā)出請求后提鸟,請求超時军援,你沒有收到下游系統(tǒng)的處理結(jié)果,那到底是成功還是失敗称勋,或者其它情況胸哥。

請求超時的情況也分很多種:

1、這個請求到達(dá)支付寶前端之前就發(fā)生了超時赡鲜,也就是支付寶根本就不知道有這筆訂單的存在空厌,也就是通常說的漏單。

2蝗蛙、支付寶已經(jīng)收到了這個請求蝇庭,但是支付失敗,這時發(fā)生超時異常捡硅,支付寶處理失敗哮内。

3、支付寶收到了這個請求壮韭,并且支付也成功北发,但這時候還是發(fā)生了超時,支付寶處理成功喷屋,但時沒有回執(zhí)琳拨。

4、支付寶收到了這個請求屯曹,支付也成功狱庇,并且發(fā)送了回執(zhí)惊畏,但因為網(wǎng)絡(luò)但原因客戶端沒有收到,客戶端超時密任,所以并不知道處理結(jié)果颜启。

遇到這種情況怎么辦?常見但做法是重試機(jī)制浪讳,重試機(jī)制有幾種方案缰盏,這里不展開。但是有一個存在的問題淹遵,請求超時是上面的那一種口猜,會不會造成重復(fù)交易的問題?這就涉及到冪等性問題透揣。

那么冪等又該如何實現(xiàn)呢济炎?多次執(zhí)行所產(chǎn)生的影響和一次執(zhí)行產(chǎn)生的影響相同。簡而言之淌实,我們需要一個去重的機(jī)制冻辩,這往往有很多實現(xiàn)方法,但有兩個很關(guān)鍵的因素:

1拆祈、冪等令牌。也就是說客戶端和服務(wù)端通過什么來識別是同一個請求倘感,或者是一個請求嘗試多次放坏。這一般需要客戶端和服務(wù)端協(xié)議,通常由客戶端來產(chǎn)生令牌老玛。

2淤年、確保唯一性。服務(wù)端通過什么來確認(rèn)是同一個請求蜡豹,也就是說怎么確認(rèn)請求的唯一性麸粮,這通常使用數(shù)據(jù)庫來實現(xiàn)。把冪等令牌作為數(shù)據(jù)庫列的唯一索引镜廉。但當(dāng)有兩個同樣的冪等令牌到達(dá)時弄诲,必然有一個會失敗。注意一點娇唯,簡單的讀檢查并不一定行齐遵,因為讀與讀之間存在競爭條件,因此有可能出錯塔插。

如果一個系統(tǒng)能正確的處理上面兩個要素梗摇,那基本上就能達(dá)到冪等等要求。那么現(xiàn)實系統(tǒng)中想许,常見等問題都出現(xiàn)在哪里呢伶授?

1断序、冪等令牌什么時候產(chǎn)生,怎么產(chǎn)生糜烹?這一點很重要逢倍。還是拿上面等例子來說,支付寶能確定對每一筆支付請求只執(zhí)行一次景图,那它必然有一個唯一標(biāo)識來區(qū)分较雕。假如客戶端對同一筆對多次請求,每次請求的冪等令牌都不一樣挚币,那支付寶也確認(rèn)不了這是同一筆交易亮蒋。

2、令牌有沒有可能被誤刪的可能妆毕。這是上面的一種特殊情況慎玖。冪等令牌是由客戶端生成的,那么如果客戶端在使用完令牌后笛粘,不小心因為DB rollback等原因被刪除啦趁怔。這時客戶端就不知道之前已經(jīng)發(fā)送過一次交易。這時候就有可能產(chǎn)生一筆新的交易薪前,并產(chǎn)生一筆新的訂單润努,服務(wù)端對此時毫無感知。所以這個必須客戶端來保證示括。

3铺浇、各種競爭條件。上面說的用DB讀來確保唯一性經(jīng)常因為競爭不工作垛膝。其實一個實現(xiàn)冪等等系統(tǒng)中鳍侣,各個環(huán)節(jié)都需要配合實現(xiàn),都需要考慮競爭條件吼拥。

4倚聚、對服務(wù)對重試處理,一般都是服務(wù)端實現(xiàn)的凿可。一個常見的做法是要區(qū)分正在處理中惑折,處理成功,處理失敗矿酵。這樣當(dāng)客戶端重新請求時唬复,根據(jù)具體情況是直接返回還是再次處理。

5全肮、一個系統(tǒng)中有多個冪等敞咧。一個是說服務(wù)端不是由一個系統(tǒng)實現(xiàn)的,A系統(tǒng)發(fā)給B系統(tǒng)辜腺,B系統(tǒng)再發(fā)給C系統(tǒng)休建,C處理完了可能還需要發(fā)給D系統(tǒng)乍恐,之后再D返回C,C返回B测砂,B再返回A等等各種情況茵烈。那么在整個鏈路中,如果A砌些、B呜投、C、D中有一個系統(tǒng)沒有正確的實現(xiàn)冪等存璃,也還是會出現(xiàn)冪等漏洞仑荐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纵东,隨后出現(xiàn)的幾起案子粘招,更是在濱河造成了極大的恐慌,老刑警劉巖偎球,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洒扎,死亡現(xiàn)場離奇詭異,居然都是意外死亡衰絮,警方通過查閱死者的電腦和手機(jī)袍冷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岂傲,“玉大人难裆,你說我怎么就攤上這事∧饕矗” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵褂痰,是天一觀的道長亩进。 經(jīng)常有香客問我,道長缩歪,這世上最難降的妖魔是什么归薛? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮匪蝙,結(jié)果婚禮上主籍,老公的妹妹穿的比我還像新娘。我一直安慰自己逛球,他們只是感情好千元,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颤绕,像睡著了一般幸海。 火紅的嫁衣襯著肌膚如雪祟身。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天物独,我揣著相機(jī)與錄音袜硫,去河邊找鬼。 笑死挡篓,一個胖子當(dāng)著我的面吹牛婉陷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播官研,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼秽澳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阀参?” 一聲冷哼從身側(cè)響起肝集,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛛壳,沒想到半個月后杏瞻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衙荐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年捞挥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忧吟。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡砌函,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溜族,到底是詐尸還是另有隱情讹俊,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布煌抒,位于F島的核電站仍劈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寡壮。R本人自食惡果不足惜贩疙,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望况既。 院中可真熱鬧这溅,春花似錦、人聲如沸棒仍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽降狠。三九已至对竣,卻和暖如春庇楞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背否纬。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工吕晌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人临燃。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓睛驳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膜廊。 傳聞我的和親對象是個殘疾皇子乏沸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)爪瓜,斷路器蹬跃,智...
    卡卡羅2017閱讀 134,697評論 18 139
  • API定義規(guī)范 本規(guī)范設(shè)計基于如下使用場景: 請求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請求頻率非常高,建議使用雙通...
    有涯逐無涯閱讀 2,557評論 0 6
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • 參與者 條款和條件 請仔細(xì)閱讀這些條款铆铆。如果您不同意這些條款蝶缀,請勿購買項目土地。 您在Brainbot Labs建...
    悅續(xù)閱讀 656評論 0 0
  • form表單有什么作用薄货?有哪些常用的input 標(biāo)簽翁都,分別有什么作用? 概述 作用 HTML 元素 表示了文檔...
    vs陳默閱讀 456評論 0 0