成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

《我想進大廠》之分布式事務(wù)篇

開發(fā) 前端 分布式
對于分布式事務(wù),相信所有人都應該很了解,為什么會有分布式事務(wù)?無論是數(shù)據(jù)量導致的分庫,還是現(xiàn)在微服務(wù)盛行的場景都是他出現(xiàn)的原因。

 [[376830]]

對于分布式事務(wù),相信所有人都應該很了解,為什么會有分布式事務(wù)?無論是數(shù)據(jù)量導致的分庫,還是現(xiàn)在微服務(wù)盛行的場景都是他出現(xiàn)的原因。

這一篇內(nèi)容還是避免不了俗套,主要的范圍無非是XA、2PC、3PC、TCC,再最后到Seata。

但是,我認為這東西,只是適用于面試和理論的了解,你真要說這些方案實際生產(chǎn)中有人用嗎?

有,但是會實現(xiàn)的更簡單,不會套用理論來實現(xiàn),大廠有大廠的解決方案,中小公司用框架或者壓根就不存在分布式事務(wù)的問題。

那,為什么還要寫這個?

為了你面試八股文啊,小可愛。

事務(wù)

要說分布式事務(wù),首先還是從事務(wù)的基本特征說起。

A原子性:在事務(wù)的執(zhí)行過程中,要么全部執(zhí)行成功,要么都不成功。

C一致性:事務(wù)在執(zhí)行前后,不能破壞數(shù)據(jù)的完整性。一致性更多的說的是通過AID來達到目的,數(shù)據(jù)應該符合預先的定義和約束,由應用層面來保證,還有的說法是C是強行為了ACID湊出來的。

I隔離性:多個事務(wù)之間是互相隔離的,事務(wù)之間不能互相干擾,涉及到不同事務(wù)的隔離級別的問題。

D持久性:一旦事務(wù)提交,數(shù)據(jù)庫中數(shù)據(jù)的狀態(tài)就應該是永久性的。

XA

XA(eXtended Architecture)是指由X/Open 組織提出的分布式事務(wù)處理的規(guī)范,他是一個規(guī)范或者說是協(xié)議,定義了事務(wù)管理器TM(Transaction Manager),資源管理器RM(Resource Manager),和應用程序。

事務(wù)管理器TM就是事務(wù)的協(xié)調(diào)者,資源管理器RM可以認為就是一個數(shù)據(jù)庫。

2PC

XA定義了規(guī)范,那么2PC和3PC就是他的具體實現(xiàn)方式。

2PC叫做二階段提交,分為投票階段和執(zhí)行階段兩個階段。

投票階段

TM向所有的參與者發(fā)送prepare請求,詢問是否可以執(zhí)行事務(wù),等待各個參與者的響應。

這個階段可以認為只是執(zhí)行了事務(wù)的SQL語句,但是還沒有提交。

如果都執(zhí)行成功了就返回YES,否則返回NO。

執(zhí)行階段

執(zhí)行階段就是真正的事務(wù)提交的階段,但是要考慮到失敗的情況。

如果所有的參與者都返回YES,那么就執(zhí)行發(fā)送commit命令,參與者收到之后執(zhí)行提交事務(wù)。

反之,只要有任意一個參與者返回的是NO的話,就發(fā)送rollback命令,然后執(zhí)行回滾的操作。

2PC的缺陷

  1. 同步阻塞,可以看到,在執(zhí)行事務(wù)的過程當中,所有數(shù)據(jù)庫的資源都被鎖定,如果這時候有其他人來訪問這些資源,將會被阻塞,這是一個很大的性能問題。
  2. TM單點問題,只要一個TM,一旦TM宕機,那么整個流程無法繼續(xù)完成。
  3. 數(shù)據(jù)不一致,如果在執(zhí)行階段,參與者腦裂或者其他故障導致沒有收到commit請求,部分提交事務(wù),部分未提交,那么數(shù)據(jù)不一致的問題就產(chǎn)生了。

3PC

既然2PC有這么多問題,所以就衍生出了3PC的概念,也叫做三階段提交,他把整個流程分成了CanCommit、PreCommit、DoCommit三個步驟,相比2PC,增加的就是CanCommit階段。

CanCommit

這個階段就是先詢問數(shù)據(jù)庫是否執(zhí)行事務(wù),發(fā)送一個canCommit的請求去詢問,如果可以的話就返回YES,反之返回NO。

PreCommit

這個階段就等同于2PC的投票階段了,發(fā)送preCommit命令,然后去執(zhí)行SQL事務(wù),成功就返回YES,反之返回NO。

但是,這個地方的區(qū)別在于參與者有了超時機制,如果參與者超時未收到doCommit命令的話,將會默認去提交事務(wù)。

DoCommit

DoCommit階段對應到2PC的執(zhí)行階段,如果上一個階段都是收到Y(jié)ES的話,那么就發(fā)送doCommit命令去提交事務(wù),反之則會發(fā)送abort命令去中斷事務(wù)的執(zhí)行。

相比2PC的改進

對于2PC的同步阻塞的問題,我們可以看到因為3PC加入了參與者的超時機制,所以原來2PC的如果某個參與者故障導致的同步阻塞的問題時間縮短了,這是一個優(yōu)化,但是并沒有完全避免。

第二個單點故障的問題,同樣因為超時機制的引入,一定程度上也算是優(yōu)化了。

但是數(shù)據(jù)不一致的問題,這個始終沒有得到解決。

舉個栗子:

在PreCommit階段,某個參與者發(fā)生腦裂,無法收到TM的請求,這時候其他參與者執(zhí)行abort事務(wù)回滾,而腦裂的參與者超時之后繼續(xù)提交事務(wù),還是有可能發(fā)生數(shù)據(jù)不一致的問題。

那么,為什么要加入DoCommit這個階段呢?就是為了引入超時機制,事先我們先確認數(shù)據(jù)庫是否都可以執(zhí)行事務(wù),如果都OK,那么才會進入后面的步驟,所以既然都可以執(zhí)行,那么超時之后說明發(fā)生了問題,就自動提交事務(wù)。

TCC

TCC的模式叫做Try、Confirm、Cancel,實際上也就是2PC的一個變種而已。

實現(xiàn)這個模式,一個事務(wù)的接口需要拆分成3個,也就是Try預占、Confirm確認提交、最后Cancel回滾。

對于TCC來說,實際生產(chǎn)我基本上就沒看見過有人用,考慮到原因,首先是程序員的本身素質(zhì)參差不齊,多個團隊協(xié)作你很難去約束別人按照你的規(guī)則來實現(xiàn),另外一點就是太過于復雜。

如果說有簡單的應用的話,庫存的應用或許可以算做是一個。

一般庫存的操作,很多實現(xiàn)方案里面都會會在下單的時候先預占庫存,下單成功之后再實際去扣減庫存,最終如果發(fā)生了異常再回退。

凍結(jié)、預占庫存就是2PC的準備階段,真正下單成功去扣減庫存就是2PC的提交階段,回滾就是某個發(fā)生異常的回滾操作,只不過在應用層面來實現(xiàn)了2PC的機制而已。

SAGA

Saga源于1987 年普林斯頓大學的 Hecto 和 Kenneth 發(fā)表的如何處理 long lived transaction(長活事務(wù))論文。

主要思想就是將長事務(wù)拆分成多個本地短事務(wù)。

如果全部執(zhí)行成功,就正常完成了,反之,則會按照相反的順序依次調(diào)用補償。

SAGA模式有兩種恢復策略:

  1. 向前恢復,這個模式偏向于一定要成功的場景,失敗則會進行重試
  2. 向后恢復,也就是發(fā)生異常的子事務(wù)依次回滾補償

由于這個模式在國內(nèi)基本沒看見有誰用的,不在贅述。

消息隊列

基于消息隊列來實現(xiàn)最終一致性的方案,這個相比前面的我個人認為還稍微靠譜一點,那些都是理論啊,正常生產(chǎn)的實現(xiàn)很少看見應用。

基于消息隊列的可能真正在應用的還稍微多一點。

一般來說有兩種方式,基于本地消息表和依賴MQ本身的事務(wù)消息。

本地消息表的這個方案其實更復雜,實際上我也沒看到過真正誰來用。這里我以RocketMQ的事務(wù)消息來舉例,這個方式相比本地消息表則更完全依賴MQ本身的特性做了解耦,釋放了業(yè)務(wù)開發(fā)的復雜工作量。

  1. 業(yè)務(wù)發(fā)起方,調(diào)用遠程接口,向MQ發(fā)送一條半事務(wù)消息,MQ收到消息之后會返回給生產(chǎn)者一個ACK
  2. 生產(chǎn)者收到ACK之后,去執(zhí)行事務(wù),但是事務(wù)還沒有提交。
  3. 生產(chǎn)者會根據(jù)事務(wù)的執(zhí)行結(jié)果來決定發(fā)送commit提交或者rollback回滾到MQ
  4. 這一點是發(fā)生異常的情況,比如生產(chǎn)者宕機或者其他異常導致MQ長時間沒有收到commit或者rollback的消息,這時候MQ會發(fā)起狀態(tài)回查。
  5. MQ如果收到的是commit的話就會去投遞消息,消費者正常消費消息即可。如果是rollback的話,則會在設(shè)置的固定時間期限內(nèi)去刪除消息。

這個方案基于MQ來保證消息事務(wù)的最終一致性,還算是一個比較合理的解決方案,只要保證MQ的可靠性就可以正常實施應用,業(yè)務(wù)消費方根據(jù)本身的消息重試達到最終一致性。

框架

以上說的都是理論和自己實現(xiàn)的方式,那么分布式事務(wù)就沒有框架來解決我們的問題嗎?

有,其實還不少,但是沒有能扛旗者出現(xiàn),要說有,阿里的開源框架Seata還有阿里云的GTS。

GTS(Global Transaction Service 全局事務(wù)服務(wù))是阿里云的中間件產(chǎn)品,只要你用阿里云,付錢就可以用GTS。

Seata(Simple Extensible Autonomous Transaction Architecture)則是開源的分布式事務(wù)框架,提供了對TCC、XA、Saga以及AT模式的支持。

那么,GTS和Seata有什么關(guān)系呢?

實際上最開始的時候他們都是基于阿里內(nèi)部的TXC(Taobao Transaction Constructor)分布式中間件產(chǎn)品,然后TXC經(jīng)過改造上了阿里云就叫做GTS。

之后阿里的中間件團隊基于TXC和GTS做出了開源的Seata,其中AT(Automatic Transaction)模式就是GTS原創(chuàng)的方案。

至于現(xiàn)在的版本,可以大致認為他們就是一樣的就行了,到2020年,GTS已經(jīng)全面兼容了Seata的 GA 版本。

圖片來自阿里云官網(wǎng)GTS

整個GTS或者Seata包含以下幾個核心組件:

  • Transaction Coordinator(TC):事務(wù)協(xié)調(diào)器,維護全局事務(wù)的運行狀態(tài),負責協(xié)調(diào)并驅(qū)動全局事務(wù)的提交或回滾。
  • Transaction Manager(TM):控制全局事務(wù)的邊界,負責開啟一個全局事務(wù),并最終發(fā)起全局提交或全局回滾的決議。
  • Resource Manager(RM):控制分支事務(wù),負責分支注冊、狀態(tài)匯報,并接收事務(wù)協(xié)調(diào)器的指令,驅(qū)動分支(本地)事務(wù)的提交和回滾。

無論對于TCC還是原創(chuàng)的AT模式的支持,整個分布式事務(wù)的原理其實相對來說還是比較容易理解。

  1. 事務(wù)開啟時,TM向TC注冊全局事務(wù),并且獲得全局事務(wù)XID
  2. 這時候多個微服務(wù)的接口發(fā)生調(diào)用,XID就會傳播到各個微服務(wù)中,每個微服務(wù)執(zhí)行事務(wù)也會向TC注冊分支事務(wù)。
  3. 之后TM就可以管理針對每個XID的事務(wù)全局提交和回滾,RM完成分支的提交或者回滾。

核心組件定義-圖片來自阿里云官網(wǎng)

AT模式

原創(chuàng)的AT模式相比起TCC的方案來說,無需自己實現(xiàn)多個接口,通過代理數(shù)據(jù)源的形式生成更新前后的UNDO_LOG,依靠UNDO_LOG來實現(xiàn)回滾的操作。

執(zhí)行的流程如下:

  1. TM向TC注冊全局事務(wù),獲得XID
  2. RM則會去代理JDBC數(shù)據(jù)源,生成鏡像的SQL,形成UNDO_LOG,然后向TC注冊分支事務(wù),把數(shù)據(jù)更新和UNDO_LOG在本地事務(wù)中一起提交
  3. TC如果收到commit請求,則會異步去刪除對應分支的UNDO_LOG,如果是rollback,就去查詢對應分支的UNDO_LOG,通過UNDO_LOG來執(zhí)行回滾

事務(wù)模式-AT-圖片來自阿里云官網(wǎng)

TCC模式

相比AT模式代理JDBC數(shù)據(jù)源生成UNDO_LOG來生成逆向SQL回滾的方式,TCC就更簡單一點了。

  1. TM向TC注冊全局事務(wù),獲得XID
  2. RM向TC注冊分支事務(wù),然后執(zhí)行Try方法,同時上報Try方法執(zhí)行情況
  3. 然后如果收到TC的commit請求就執(zhí)行Confirm方法,收到rollback則執(zhí)行Cancel

事務(wù)模式-TCC-圖片來自阿里云官網(wǎng)

XA模式

  1. TM向TC注冊全局事務(wù),獲得XID
  2. RM向TC注冊分支事務(wù),XA Start,執(zhí)行SQL,XA END,XA Prepare,然后上報分支執(zhí)行情況
  3. 然后如果收到TC的commit請求就執(zhí)行Confirm方法,收到rollback則執(zhí)行Cancel

事務(wù)模式-XA-圖片來自阿里云官網(wǎng)

SAGA模式

  • TM向TC注冊全局事務(wù),獲得XID
  • RM向TC注冊分支事務(wù),然后執(zhí)行業(yè)務(wù)方法,并且上報分支執(zhí)行情況
  • RM收到分支回滾,執(zhí)行對應的業(yè)務(wù)回滾方法

事務(wù)模式-Saga-圖片來自阿里云官網(wǎng)

總結(jié)

這里從事務(wù)的ACID開始,向大家先說了XA是分布式事務(wù)處理的規(guī)范,之后談到2PC和3PC,2PC有同步阻塞、單點故障和數(shù)據(jù)不一致的問題,3PC在一定程度上解決了同步阻塞和單點故障的問題,但是還是沒有完全解決數(shù)據(jù)不一致的問題。

之后說到TCC、SAGA、消息隊列的最終一致性的方案,TCC由于實現(xiàn)過于麻煩和復雜,業(yè)務(wù)很少應用,SAGA了解即可,國內(nèi)也很少有應用到的,消息隊列提供了解耦的實現(xiàn)方式,對于中小公司來說可能是較為低成本的實現(xiàn)方式。

最后再說目前國內(nèi)的實現(xiàn)框架,云端阿里云的GTS兼容Seata,非云端使用Seata,它提供了XA、TCC、AT、SAGA的解決方案,可以說是目前的主流選擇。

本文轉(zhuǎn)載自微信公眾號「艾小仙」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系艾小仙公眾號。

 

責任編輯:武曉燕 來源: 艾小仙
相關(guān)推薦

2022-07-10 20:24:48

Seata分布式事務(wù)

2020-09-29 19:20:05

鴻蒙

2021-02-24 16:17:18

架構(gòu)運維技術(shù)

2021-08-06 08:33:27

Springboot分布式Seata

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2023-02-11 00:04:17

分布式系統(tǒng)安全

2022-06-21 08:27:22

Seata分布式事務(wù)

2017-07-26 15:08:05

大數(shù)據(jù)分布式事務(wù)

2021-09-07 10:43:25

EverDB分布式執(zhí)行

2015-05-20 15:54:04

Openstack分布式存儲

2020-11-06 12:12:35

HarmonyOS

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2009-06-19 15:28:31

JDBC分布式事務(wù)

2009-09-18 15:10:13

分布式事務(wù)LINQ TO SQL

2021-09-29 09:07:37

分布式架構(gòu)系統(tǒng)

2022-09-25 22:19:24

Dapr分布式追蹤

2022-04-08 07:22:15

分布式計數(shù)器系統(tǒng)設(shè)計

2023-02-23 07:55:41

2021-10-11 19:30:02

分布式事務(wù)CAP

2020-04-20 19:00:30

程序員分布式事務(wù)架構(gòu)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美综合一区二区 | 日本羞羞影院 | 天天操夜夜操免费视频 | 中文字幕第一页在线 | 无毛av| 久久国产一区二区三区 | 视频一区二区三区在线观看 | 欧美日韩黄色一级片 | 99re在线免费视频 | 91精品国产91久久久久久丝袜 | 欧美一区免费在线观看 | 拍真实国产伦偷精品 | 视频一区在线观看 | 国产一区二区成人 | 精品亚洲一区二区三区 | 国产在线视频99 | 波多野结衣一区二区三区 | 色在线视频网站 | 国产在线拍偷自揄拍视频 | 欧美综合国产精品久久丁香 | 操到爽 | 久久久久国产精品一区 | 亚洲一区二区中文字幕在线观看 | 99在线精品视频 | 亚洲视频免费观看 | 99热碰 | 91精品一区二区三区久久久久 | 九九久视频| 久久一热 | 亚洲精品视频在线观看免费 | 欧美一区| 日本一区二区视频 | 精品国产青草久久久久福利 | 91中文字幕 | 国产精品日韩 | 精品国产色 | 国产精品呻吟久久av凹凸 | 国产精品视频免费观看 | 国产高清免费视频 | 韩国毛片一区二区三区 | 99久久免费精品视频 |