91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

分布式事務的四種解決方案分別是什么

發布時間:2021-12-07 10:12:25 來源:億速云 閱讀:134 作者:柒染 欄目:云計算

這篇文章給大家介紹分布式事務的四種解決方案分別是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

簡述

分布式事務指事務的操作位于不同的節點上,需要保證事務的 AICD 特性。

例如在下單場景下,庫存和訂單如果不在同一個節點上,就涉及分布式事務。

解決方案

在分布式系統中,要實現分布式事務,無外乎那幾種解決方案。

一、兩階段提交(2PC)

兩階段提交(Two-phase Commit,2PC),通過引入協調者(Coordinator)來協調參與者的行為,并最終決定這些參與者是否要真正執行事務。

1. 運行過程

1.1 準備階段

協調者詢問參與者事務是否執行成功,參與者發回事務執行結果。

分布式事務的四種解決方案分別是什么

1.2 提交階段

如果事務在每個參與者上都執行成功,事務協調者發送通知讓參與者提交事務;否則,協調者發送通知讓參與者回滾事務。

需要注意的是,在準備階段,參與者執行了事務,但是還未提交。只有在提交階段接收到協調者發來的通知后,才進行提交或者回滾。

分布式事務的四種解決方案分別是什么

2. 存在的問題

2.1 同步阻塞 所有事務參與者在等待其它參與者響應的時候都處于同步阻塞狀態,無法進行其它操作。

2.2 單點問題 協調者在 2PC 中起到非常大的作用,發生故障將會造成很大影響。特別是在階段二發生故障,所有參與者會一直等待狀態,無法完成其它操作。

2.3 數據不一致 在階段二,如果協調者只發送了部分 Commit 消息,此時網絡發生異常,那么只有部分參與者接收到 Commit 消息,也就是說只有部分參與者提交了事務,使得系統數據不一致。

2.4 太過保守 任意一個節點失敗就會導致整個事務失敗,沒有完善的容錯機制。

二、補償事務(TCC)

TCC 其實就是采用的補償機制,其核心思想是:針對每個操作,都要注冊一個與其對應的確認和補償(撤銷)操作。它分為三個階段:

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

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

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

舉個例子,假入 Bob 要向 Smith 轉賬,思路大概是:我們有一個本地方法,里面依次調用

  1. 首先在 Try 階段,要先調用遠程接口把 Smith 和 Bob 的錢給凍結起來。

  2. 在 Confirm 階段,執行遠程調用的轉賬的操作,轉賬成功進行解凍。

  3. 如果第2步執行成功,那么轉賬成功,如果第二步執行失敗,則調用遠程凍結接口對應的解凍方法 (Cancel)。

優點: 跟2PC比起來,實現以及流程相對簡單了一些,但數據的一致性比2PC也要差一些

缺點: 缺點還是比較明顯的,在2,3步中都有可能失敗。TCC屬于應用層的一種補償方式,所以需要程序員在實現的時候多寫很多補償的代碼,在一些場景中,一些業務流程可能用TCC不太好定義及處理。

三、本地消息表(異步確保)

本地消息表與業務數據表處于同一個數據庫中,這樣就能利用本地事務來保證在對這兩個表的操作滿足事務特性,并且使用了消息隊列來保證最終一致性。

  1. 在分布式事務操作的一方完成寫業務數據的操作之后向本地消息表發送一個消息,本地事務能保證這個消息一定會被寫入本地消息表中。

  2. 之后將本地消息表中的消息轉發到 Kafka 等消息隊列中,如果轉發成功則將消息從本地消息表中刪除,否則繼續重新轉發。

  3. 在分布式事務操作的另一方從消息隊列中讀取一個消息,并執行消息中的操作。

分布式事務的四種解決方案分別是什么

優點: 一種非常經典的實現,避免了分布式事務,實現了最終一致性。

缺點: 消息表會耦合到業務系統中,如果沒有封裝好的解決方案,會有很多雜活需要處理。

四、MQ 事務消息

有一些第三方的MQ是支持事務消息的,比如RocketMQ,他們支持事務消息的方式也是類似于采用的二階段提交,但是市面上一些主流的MQ都是不支持事務消息的,比如 RabbitMQ 和 Kafka 都不支持。

以阿里的 RocketMQ 中間件為例,其思路大致為:

第一階段Prepared消息,會拿到消息的地址。第二階段執行本地事務,第三階段通過第一階段拿到的地址去訪問消息,并修改狀態。

也就是說在業務方法內要想消息隊列提交兩次請求,一次發送消息和一次確認消息。如果確認消息發送失敗了RocketMQ會定期掃描消息集群中的事務消息,這時候發現了Prepared消息,它會向消息發送者確認,所以生產方需要實現一個check接口,RocketMQ會根據發送端設置的策略來決定是回滾還是繼續發送確認消息。這樣就保證了消息發送與本地事務同時成功或同時失敗。

分布式事務的四種解決方案分別是什么

優點: 實現了最終一致性,不需要依賴本地數據庫事務。

缺點: 實現難度大,主流MQ不支持,RocketMQ事務消息部分代碼也未開源。

通過本文我們總結并對比了幾種分布式分解方案的優缺點,分布式事務本身是一個技術難題,是沒有一種完美的方案應對所有場景的,具體還是要根據業務場景去抉擇吧。阿里RocketMQ去實現的分布式事務,現在也有除了很多分布式事務的協調器,比如LCN等,大家可以多去嘗試。

關于分布式事務的四種解決方案分別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绵阳市| 芦山县| 辽阳市| 富蕴县| 凌海市| 潞西市| 鹤山市| 泰顺县| 深泽县| 宣威市| 靖江市| 鹿泉市| 噶尔县| 江阴市| 沁阳市| 灯塔市| 鄱阳县| 隆子县| 和静县| 衢州市| 武义县| 来安县| 金寨县| 牡丹江市| 禹州市| 岑溪市| 子洲县| 伊宁市| 金川县| 漯河市| 偃师市| 锡林浩特市| 山丹县| 宜都市| 吉林省| 奇台县| 宁津县| 隆子县| 开化县| 思茅市| 靖宇县|