一篇文章完全搞懂「分佈式事務」

分佈式事務是企業集成中的一個技術難點,也是每個分佈式系統架構中都會涉及到的一個東西,特別是在這幾年愈來愈火的微服務架構中,幾乎能夠說是沒法避免。面試

本篇文章將經過詳解分佈式事務的一致性,以及分佈式事務實戰解決方案,幫助你們搞懂分佈式事務,推薦收藏。數據庫

01 爲何須要分佈式事務緩存

因爲近十年互聯網的發展很是迅速,不少網站的訪問愈來愈大,集中式環境已經不能知足業務的須要了,只能按照業務爲單位進行數據拆分(包含:垂直拆分與水平拆分),以及按照業務爲單位提供服務,從早期的集中式轉變爲面向服務架構的分佈式應用環境。服務器

舉一個典型的例子,阿里的淘寶網站隨着訪問量愈來愈大,只能按照商品、訂單、用戶、店鋪等業務爲單位進行數據庫拆分,以及按照業務爲單位提供服務接口。架構

這個時候 爲了完成一個簡單的業務功能,好比:購買商品後扣款,有可能須要橫跨多個服務,涉及用戶訂單、商品庫存、支付等多個數據庫,而這些操做又須要在同一個事務中完,這就涉及到到了分佈式事務。併發

本質上來講,分佈式事務就是爲了保證不一樣資源服務器的數據一致性。框架

02 分佈式的一致性理論異步

最先加州大學伯克利分校 Eric Brewer教授提出一個分佈式系統特性的CAP理論。分佈式

 

1.CAP 理論的不可能三角微服務

一致性(Consistency)

可用性(Availability)

分區容錯性(Partition tolerance)

在分佈式系統中,是不存在同時知足一致性 Consistency、可用性 Availability和分區容錯性 Partition Tolerance三者的。

一句話總結:一致性、可用性和分區容錯在分佈式事務中不可兼得。

在絕大多數的場景,都須要犧牲強一致性來換取系統的高可用性,系統每每只須要保證最終一致性。

這也是是後來發展出的BASE理論的基礎。

2.BASE 理論

Basically Available(基本可用)

Soft state(柔軟狀態)

Eventually consistent(最終一致性)三個短語的簡寫。

BASE是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網系統分佈式實踐的結論,是基於CAP定理逐步演化而來的,其核心思想是即便沒法作到強一致性(Strong consistency),但每一個應用均可以根據自身的業務特色,採用適當的方式來使系統達到最終一致性(Eventual consistency)。

03 分佈式事務的解決方案

1.基於XA協議的兩階段提交 2PC(2-phase commit protocol)

XA是一個分佈式事務協議,XA中大體分爲兩部分:事務管理器和本地資源管理器,其中本地資源管理器每每由數據庫實現,而事務管理器做爲全局的調度者,負責各個本地資源的提交和回滾。

大體的流程:

第一階段是表決階段,全部參與者都將本事務可否成功的信息反饋發給協調者;

第二階段是執行階段,協調者根據全部參與者的反饋,通知全部參與者,步調一致地在全部分支上提交或者回滾。

優缺點

儘可能保證了數據的強一致,實現成本較低,在各大主流數據庫都有本身實現,存在單點故障問題、性能問題、跨數據庫問題。

2.事務補償TCC模式

TCC方案實際上是兩階段提交的一種改進,將整個業務邏輯的每一個分支顯式的分紅了Try、Confirm、Cancel三個操做。

Try部分完成業務的準備工做,confirm部分完成業務的提交,cancel部分完成事務的回滾,基本原理以下圖所示:

優缺點

對代碼有侵入性,下降了鎖衝突,提升了吞吐量,缺點是有時候並無那麼好實現。

案例

螞蟻金服的DTS(prepare、commit、rollback)

3.消息隊列最終一致性方案

經過異步解耦的方式,經過第三方中間件。

案例

RocketMQ RabbitMQ等都可實現,RocketMQ 還有專門的事務型消息,新版的kafka也有。

本文介紹了分佈式事務的一些特性和解決方案,分佈式事務最初是爲解決單服務多數據庫資源的場景而誕生的。隨着技術的發展,特別是 SOA 分佈式應用架構,以及微服務時代的到來,服務變成了基本業務單元。

分佈式系統中事務更多的是對CAP權衡,在實際應用中,會根據業務要求、開發人員狀況以及所用框架不一樣進行調整。

若是以爲有用,請點贊支持下,送BAT架構專題合集500+,私信回覆【架構】便可領取。

我是Mike 陳睿,專一分享:BAT架構技術乾貨連載+BAT面試真題及答案等純技術乾貨。

------end------

推薦閱讀:

Redis緩存和MySQL數據一致性方案詳解 

如何解決Redis雪崩、穿透、併發等5大難題   

Redis併發競爭key的解決方案詳解 

Redis爲何是單線程、及高併發快的3大緣由詳解

分佈式鎖的由來、特色及Redis分佈式鎖的實現

如何從0到1設計一個類Dubbo的RPC框架 

如何從0到1設計一個MQ消息隊列

MQ消息隊列的12點核心原理總結     

詳解RPC遠程調用和消息隊列MQ的區別    

阿里45K高級Java崗,必備技能清單

相關文章
相關標籤/搜索