分布式事務處理中的冪等性

事務是指以全有或全無的方式執(zhí)行的一系列操作卵洗。所有操作必須全部成功完成,否則在每個操作中所作的所有更改都會被撤消。

以數(shù)據(jù)庫為列棵里,事物包含四個特性(ACID)

  • 原子性(Atomicity):操作這些指令時,要么全部執(zhí)行成功姐呐,要么全部不執(zhí)行殿怜。只要其中一個指令執(zhí)行失敗,所有的指令都執(zhí)行失敗曙砂,數(shù)據(jù)進行回滾头谜,回到執(zhí)行指令前的數(shù)據(jù)狀態(tài)。
  • 一致性(Consistency):事務的執(zhí)行使數(shù)據(jù)從一個狀態(tài)轉換為另一個狀態(tài)鸠澈,但是對于整個數(shù)據(jù)的完整性保持穩(wěn)定柱告。
  • 隔離性(Isolation):隔離性是當多個用戶并發(fā)訪問數(shù)據(jù)庫時截驮,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務际度,不能被其他事務的操作所干擾葵袭,多個并發(fā)事務之間要相互隔離。即要達到這么一種效果:對于任意兩個并發(fā)的事務T1和T2乖菱,在事務T1看來坡锡,T2要么在T1開始之前就已經結束,要么在T1結束之后才開始窒所,這樣每個事務都感覺不到有其他事務在并發(fā)地執(zhí)行鹉勒。
  • 持久性(Durability):當事務正確完成后,它對于數(shù)據(jù)的改變是永久性的吵取。

而在分布式系統(tǒng)中禽额,你不能指望ACID事務。因為在分布式系統(tǒng)中會對數(shù)據(jù)庫進行分區(qū)皮官,這里所說的分區(qū)指的是物理分區(qū)绵疲,分區(qū)之后可能不同的庫就處于不同的服務器上了,這個時候單個數(shù)據(jù)庫的ACID已經不能適應這種情況了臣疑,而在這種ACID的集群環(huán)境下盔憨,再想保證集群的ACID幾乎是很難達到,或者即使能達到那么效率和性能會大幅下降讯沈。

在沒有ACID的情況下解決數(shù)據(jù)一致性的常見技巧是使用補償郁岩。這種方法與ACID事務不同,你可以具有不一致的中間狀態(tài)缺狠。在業(yè)務處理中通澄噬鳎可以忍受這些暫時的不一致,只要能確保最終清理它們并使系統(tǒng)恢復到一致狀態(tài)挤茄。這稱為最終一致性如叼,這是分布式系統(tǒng)中的一個重要概念。

最終的一致性通常會產生更好的性能穷劈,更簡單的操作和更好的可伸縮性笼恰,同時幫助程序員理解更復雜的數(shù)據(jù)模型。

在實現(xiàn)最終一致性時會出現(xiàn)消息重復發(fā)送問題歇终。實際應用情況是社证,在分布式系統(tǒng)中確切地保證消息傳遞是不可能的。實現(xiàn)一次準確的消息傳遞完全基于消息生成者從消息使用者那里接收到確認消息评凝。但是追葡,ACK本身是不可靠的,因為它也將通過網絡傳播。在處理消息后宜肉,由于網絡問題或消費者崩潰匀钧,很可能會丟失ACK。

任何通過網絡進行通信谬返,都可能會出現(xiàn)三種故障情形:

  • 該請求尚未到達服務提供商
  • 請求已到達服務提供商之斯,但在處理期間出現(xiàn)異常
  • 服務提供程序處理了請求,但響應丟失了
image

那么如何才能實現(xiàn)準確的消息傳遞朱浴?它的答案是冪等性吊圾!你必須使你的消費者操作具有冪等性达椰。冪等性就是用戶對于同一操作發(fā)起的一次請求或者多次請求的結果是一致的翰蠢,不會因為多次點擊而產生了副作用。舉個最簡單的例子啰劲,用戶購買商品后支付梁沧,支付扣款成功,但是返回結果的時候網絡異常蝇裤,此時錢已經扣了廷支,用戶再次點擊按鈕,此時不應該進行第二次扣款栓辜。

添加冪等性處理方法:

  • 唯一標識恋拍。你可以生成唯一標識符并將其添加到業(yè)務中。這樣藕甩,如果在服務提供端存儲該ID施敢,則可以輕松發(fā)現(xiàn)重復調用。
  • 利用工作流引擎狭莱,比如Apache ActiveMQ可以在生產者向代理發(fā)送消息時過濾掉重復項僵娃,代理索引可以跟蹤和識別重復項并將其丟棄。
  • 請求哈希腋妙。如果你使用消息傳遞默怨,則可以通過存儲消息的哈希值來執(zhí)行相同的操作。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末骤素,一起剝皮案震驚了整個濱河市匙睹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌济竹,老刑警劉巖垃僚,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異规辱,居然都是意外死亡谆棺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改淑,“玉大人碍岔,你說我怎么就攤上這事《湎模” “怎么了蔼啦?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仰猖。 經常有香客問我捏肢,道長,這世上最難降的妖魔是什么饥侵? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任鸵赫,我火速辦了婚禮,結果婚禮上躏升,老公的妹妹穿的比我還像新娘辩棒。我一直安慰自己,他們只是感情好膨疏,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布一睁。 她就那樣靜靜地躺著,像睡著了一般佃却。 火紅的嫁衣襯著肌膚如雪者吁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天饲帅,我揣著相機與錄音复凳,去河邊找鬼。 笑死洒闸,一個胖子當著我的面吹牛染坯,可吹牛的內容都是我干的。 我是一名探鬼主播丘逸,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼单鹿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了深纲?” 一聲冷哼從身側響起仲锄,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎湃鹊,沒想到半個月后儒喊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡币呵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年怀愧,在試婚紗的時候發(fā)現(xiàn)自己被綠了侨颈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡芯义,死狀恐怖哈垢,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情扛拨,我是刑警寧澤耘分,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站绑警,受9級特大地震影響求泰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜计盒,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一渴频、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧章郁,春花似錦枉氮、人聲如沸志衍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楼肪。三九已至培廓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間春叫,已是汗流浹背肩钠。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暂殖,地道東北人价匠。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像呛每,于是被迫代替她去往敵國和親踩窖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容