分布式事務

兩階段提交(2PC)

?????????XA是X/Open CAE Specification (Distributed Transaction Processing)模型中定義的TM(Transaction Manager)與RM(Resource Manager)之間進行通信的接口。

?? ?????在XA規范中,數據庫充當RM角色,應用需要充當TM的角色,即生成全局的txId,調用XAResource接口,把多個本地事務協調為全局統一的分布式事務。

????????二階段提交是XA的標準實現。它將分布式事務的提交拆分為2個階段:prepare和commit/rollback。

????????2PC模型中,在prepare階段需要等待所有參與子事務的反饋,因此可能造成數據庫資源鎖定時間過長,不適合并發高以及子事務生命周長較長的業務場景。兩階段提交這種解決方案屬于犧牲了一部分可用性來換取的一致性。

補償事務(TCC)

TCC 其實就是采用的補償機制,其核心思想是:針對每個操作,都要注冊一個與其對應的確認和補償(撤銷)操作。TCC模型是把鎖的粒度完全交給業務處理。它分為三個階段:

Try 階段主要是對業務系統做檢測及資源預留

Confirm 階段主要是對業務系統做確認提交,Try階段執行成功并開始執行 Confirm階段時,默認 Confirm階段是不會出錯的。即:只要Try成功,Confirm一定成功。

Cancel 階段主要是在業務執行錯誤,需要回滾的狀態下執行的業務取消,預留資源釋放。


匯款服務和收款服務分別需要實現,Try-Confirm-Cancel接口,并在業務初始化階段將其注入到TCC事務管理器中。、

由此可以看出,TCC模型對業務的侵入強,改造的難度大。

本地消息表(異步確保)

本地消息表這種實現方式應該是業界使用最多的,其核心思想是將分布式事務拆分成本地事務進行處理,這種思路是來源于ebay。我們可以從下面的流程圖中看出其中的一些細節:


基本思路就是:

????????消息生產方,需要額外建一個消息表,并記錄消息發送狀態。消息表和業務數據要在一個事務里提交,也就是說他們要在一個數據庫里面。然后消息會經過MQ發送到消息的消費方。如果消息發送失敗,會進行重試發送。

????????消息消費方,需要處理這個消息,并完成自己的業務邏輯。此時如果本地事務處理成功,表明已經處理成功了,如果處理失敗,那么就會重試執行。如果是業務上面的失敗,可以給生產方發送一個業務補償消息,通知生產方進行回滾等操作。

????????生產方和消費方定時掃描本地消息表,把還沒處理完成的消息或者失敗的消息再發送一遍。如果有靠譜的自動對賬補賬邏輯,這種方案還是非常實用的。


盡最大努力通知


? ??????最大努力通知方案主要也是借助MQ消息系統來進行事務控制,這一點與可靠消息最終一致方案一樣。看來MQ中間件確實在一個分布式系統架構中,扮演者重要的角色。最大努力通知方案是比較簡單的分布式事務方案,它本質上就是通過定期校對,實現數據一致性。

最大努力通知方案的實現

業務活動的主動方,在完成業務處理之后,向業務活動的被動方發送消息,允許消息丟失。

主動方可以設置時間階梯型通知規則,在通知失敗后按規則重復通知,直到通知N次后不再通知。

主動方提供校對查詢接口給被動方按需校對查詢,用于恢復丟失的業務消息。

業務活動的被動方如果正常接收了數據,就正常返回響應,并結束事務。

如果被動方沒有正常接收,根據定時策略,向業務活動主動方查詢,恢復丟失的業務消息

最大努力通知方案的特點

1、用到的服務模式:可查詢操作、冪等操作。

2、被動方的處理結果不影響主動方的處理結果;

3、適用于對業務最終一致性的時間敏感度低的系統;

4、適合跨企業的系統間的操作,或者企業內部比較獨立的系統間的操作,比如銀行通知、商戶通知等;


案例:

eBay 本地消息表

本地消息表這種實現方式的思路,其實是源于ebay,后來通過支付寶等公司的布道,在業內廣泛使用。其基本的設計思想是將遠程分布式事務拆分成一系列的本地事務。如果不考慮性能及設計優雅,借助關系型數據庫中的表即可實現。

舉個經典的跨行轉賬的例子來描述。第一步,扣款1W,通過本地事務保證了憑證消息插入到消息表中。第二步,通知對方銀行賬戶上加1W了。那問題來了,如何通知到對方呢?

通常采用兩種方式:

采用時效性高的MQ,由對方訂閱消息并監聽,有消息時自動觸發事件

采用定時輪詢掃描的方式,去檢查消息表的數據。

類似使用本地消息表+消息通知的還有去哪兒,蘑菇街

各種第三方支付回調

最大努力通知型。如支付寶、微信的支付回調接口方式,不斷回調直至成功,或直至調用次數衰減至失敗狀態。

我們可以怎么來做

2PC/3PC需要資源管理器(mysql, redis)支持XA協議,且整個事務的執行期間需要鎖住事務資源,會降低性能。故先排除。

TCC的模式,需要事務接口提供try,confirm,cancel三個接口,提高了編程的復雜性。需要依賴于業務方來配合提供這樣的接口。推行難度大,暫時排除。

最大努力通知型,應用于異構或者服務平臺當中

可以看到ebay的經典模式中,分布式的事務,是通過本地事務+可靠消息,來達到事務的最終一致性的。但是出現了事務消息,就把本地事務的工作給涵蓋在事務消息當中了。所以,接下來要基于事務消息來套我們的應用場景,看起是否滿足我們對分布式事務產品的要求。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容