oledb 访问接口sqlncli10返回了消息 没有活动事务_这样理解分布式事务你是不是就会懂了?...
分布式事務主要解決分布式一致性的問題。說到底就是數(shù)據(jù)的分布式操作導致僅依靠本地事務無法保證原的性。與單機版的事務不同的是,單機是把多個命令打包成一個統(tǒng)一處理,分布式事務是將多個機器上執(zhí)行的命令打包成一個命令統(tǒng)一處理。
常見的分布式事務場景#
分布式事務其實就在我們身邊,你一直在用,但是你卻一直不注意它。
轉賬
扣你賬戶的余額,增加別人賬戶余額,如果只扣了你的,別人沒增加這是失敗;如果沒扣你的錢別人也增加了那銀行的賠錢。
下訂單/扣庫存
電商系統(tǒng)中這是很常見的一個場景,用戶下單成功了,店家沒收到單,不發(fā)貨;用戶取消了訂單,但是店家卻看到了訂單,發(fā)了貨。
分庫分表場景
當我們的數(shù)據(jù)量大了之后,我們可能會部署很多獨立的數(shù)據(jù)庫,但是你的一個邏輯可能會同時操作很多個數(shù)據(jù)庫的表,這時候該如何保證所有的操作要么成功,要么失敗。
分布式系統(tǒng)調用問題
微服務的拆分讓各個系統(tǒng)各司其職,但是帶來的也有很多痛苦,一個操作可能會伴隨很多的外部請求,如果某一個外部系統(tǒng)掛掉了,之前操作已完成的這些是否需要回滾。
針對上面這些問題,我們前面學過的數(shù)據(jù)庫4大特性:ACID 似乎在這里想要達到就變得很困難,單機情況下你還可以通過鎖和日志機制來控制數(shù)據(jù),在分布式場景又該如何實現(xiàn)呢?在不同的分布式應用架構下,實現(xiàn)一個分布式事務要考慮的問題并不完全一樣,比如對多資源的協(xié)調、事務的跨服務傳播等,實現(xiàn)機制也是復雜多變。盡管有這么多工程細節(jié)需要考慮,但分布式事務最核心的還是其 ACID 特性,只是這種 ACID 變換了場景。
分布式理論#
CAP 定理
傳統(tǒng)的 ACID 模型肯定無法解決分布式環(huán)境下的挑戰(zhàn),基于此加州大學伯克利分校 Eric Brewer教授提出 CAP 定理,他指出 現(xiàn)代 WEB 服務無法同時滿足以下 3 個屬性:
- 一致性(Consistency) : 所有的客戶端都能返回最新的操作。
- 可用性(Availability) : 非故障的節(jié)點在合理的時間內返回合理的響應(不是錯誤和超時的響應)。
- 分區(qū)容錯性(Partition tolerance) : 即使出現(xiàn)單個組件無法可用,操作依然可以完成。
關于一致性的理解后面分出來三個方向:
- 強一致:任何一次讀都能讀到某個數(shù)據(jù)的最近一次寫的數(shù)據(jù)。系統(tǒng)中的所有進程,看到的操作順序,都和全局時鐘下的順序一致。簡言之,在任意時刻,所有節(jié)點中的數(shù)據(jù)是一樣的。
- 弱一致:數(shù)據(jù)更新后,如果能容忍后續(xù)的訪問只能訪問到部分或者全部訪問不到,則是弱一致性。
- 最終一致:不保證在任意時刻任意節(jié)點上的同一份數(shù)據(jù)都是相同的,但是隨著時間的遷移,不同節(jié)點上的同一份數(shù)據(jù)總是在向不同的方向變化。簡單說,就是在一段時間后,節(jié)點間的數(shù)據(jù)會最終達到一致狀態(tài)。
關于一致性的理解不同,后面對于 CAP 理論的實現(xiàn)就有所不同。
另外 Eric Brewer教授指出現(xiàn)代 WEB 服務無法同時滿足這 3 個屬性,說的是無法同時滿足,那這是為什么呢?
如果在某個分布式系統(tǒng)中無副本,那么必然滿足強一致性,同時也滿足可用性,但是如果這個數(shù)據(jù)宕機了,那么可用性就得不到保證。
如果一個系統(tǒng)滿足 AP,那么一致性又得不到保證。所以 CAP 原則的精髓就是要么 AP,要么 CP,要么 AC,但是不存在 CAP。
BASE 定理
基于前面提到的 CAP,反正我們都無法同時滿足CAP,設計系統(tǒng)的最高目的就是讓他跑下去不出錯,那么是不是可以不要求強一致性,最終讓他一致即可。所以后面又提出來了 BASE 定理:
- Basically Available(基本可用)
- Soft state(軟狀態(tài))
- Eventually consistent(最終一致性)
基于現(xiàn)在大型分布式系統(tǒng)的復雜性,我們無法保證服務永遠達到999,那么是否可以取舍,核心服務達到999,非核心服務允許掛為了保全核心服務。另外在非核心服務 down 機過程中允許系統(tǒng)暫時出現(xiàn)不一致但是這個不一致并不影響系統(tǒng)的核心功能使用。
最終系統(tǒng)恢復,所有服務一起修復數(shù)據(jù),最終達到一致的狀態(tài)。
業(yè)內通常把嚴格遵循 ACID 的事務稱為剛性事務,而基于 BASE 思想實現(xiàn)的事務稱為柔性事務。柔性事務并不是完全放棄了 ACID,僅僅是放寬了一致性要求:事務完成后的一致性嚴格遵循,事務中的一致性可適當放寬。
常見的分布式事務實現(xiàn)方案#
分布式事務實現(xiàn)方案從類型上區(qū)分剛性事務、柔性事務。剛性事務:通常無業(yè)務改造,強一致性,原生支持回滾/隔離性,低并發(fā),適合短事務。柔性事務:有業(yè)務改造,最終一致性,實現(xiàn)補償接口,實現(xiàn)資源鎖定接口,高并發(fā),適合長事務。
- 剛性事務:XA 協(xié)議(2PC、JTA、JTS)、3PC
- 柔性事務:TCC/FMT、Saga(狀態(tài)機模式、Aop模式)、本地事務消息、消息事務(半消息)、最多努力通知型事務
兩階段提交(XA)
與本地事務一樣,分布式事務場景下也可以采用兩階段提交的方案來實現(xiàn)。XA 的全稱是 eXtended Architecture,它是一個分布式事務協(xié)議,通過二階段提交協(xié)議保證強一致性。
XA 規(guī)范中定義了分布式事務處理模型,這個模型中包含四個核心角色:
- RM (Resource Managers):資源管理器,提供數(shù)據(jù)資源的操作、管理接口,保證數(shù)據(jù)的一致性和完整性。最有代表性的就是數(shù)據(jù)庫管理系統(tǒng),當然有的文件系統(tǒng)、MQ 系統(tǒng)也可以看作 RM。
- TM (Transaction Managers):事務管理器,是一個協(xié)調者的角色,協(xié)調跨庫事務關聯(lián)的所有 RM 的行為。
- AP (Application Program):應用程序,按照業(yè)務規(guī)則調用 RM 接口來完成對業(yè)務模型數(shù)據(jù)的變更,當數(shù)據(jù)的變更涉及多個 RM 且要保證事務時,AP 就會通過 TM 來定義事務的邊界,TM 負責協(xié)調參與事務的各個 RM 一同完成一個全局事務。
- CRMs (Communication Resource Managers):主要用來進行跨服務的事務的傳播。
XA 協(xié)議大概的兩個流程為:
XA 協(xié)議是如何滿足 ACID 的呢?
原的性和持久性我們就不用說,我們看看隔離性和一致性。
隔離性
XA 協(xié)議中沒有描述如何實現(xiàn)分布式事務的隔離性,但是 XA 協(xié)議要求每個資源管理器都要實現(xiàn)本地事務,也就是說基于 XA 協(xié)議實現(xiàn)的分布式事務的隔離性是由每個資源管理器本地事務的隔離性來保證的,當一個分布式事務的所有子事務都是隔離的,那么這個分布式事務天然的就實現(xiàn)了隔離性。
一致性
在單機環(huán)境下的一致性就是保證當前服務器數(shù)據(jù)一致即可。事務執(zhí)行完畢數(shù)據(jù)最終一致,不同的隔離級別下事務執(zhí)行過程的中間狀態(tài)不能被別的事務觀察到。
事務執(zhí)行完畢最終一致這個好保證,但是在RR 隔離級別下不可見一個未提交事務的中間態(tài)在分布式情況該如何做到呢?單機上 MySQL 提供了MVCC機制,采用多版本控制來處理,那分布式事務場景也是否也可以提供這樣的機制呢?XA 協(xié)議并沒有定義怎么實現(xiàn)全局的快照,一個基本思路是用一個集中式或者邏輯上單調遞增的東西來控制生成全局 Snapshot,每個事務或者每條 SQL 執(zhí)行時都去獲取一次,從而實現(xiàn)不同隔離級別下的一致性。當然開發(fā)的難度還是挺大。
存在的問題:
- 同步阻塞:當參與事務者存在占用公共資源的情況,其中一個占用了資源,其他事務參與者就只能阻塞等待資源釋放,處于阻塞狀態(tài)。
- 單點故障:一旦事務管理器出現(xiàn)故障,整個系統(tǒng)不可用。
- 數(shù)據(jù)不一致:在階段二,如果事務管理器只發(fā)送了部分 commit 消息,此時網(wǎng)絡發(fā)生異常,那么只有部分參與者接收到 commit 消息,也就是說只有部分參與者提交了事務,使得系統(tǒng)數(shù)據(jù)不一致。
- 不確定性:當事務管理器發(fā)送 commit 之后,并且此時只有一個參與者收到了 commit,那么當該參與者與事務管理器同時宕機之后,重新選舉的事務管理器無法確定該條消息是否提交成功。
總體來說 XA 方案實現(xiàn)簡單,但是帶來的問題如果放在數(shù)據(jù)一致性要求嚴格的場景是無法保證數(shù)據(jù)正確性的。另外事務管理器單點會帶來隱患,同步阻塞模型也致使并發(fā)能力弱。
TCC
關于 TCC(Try-Confirm-Cancel)的概念,最早是由 Pat Helland 于 2007 年發(fā)表的一篇名為《Life beyond Distributed Transactions:an Apostate’s Opinion》的論文提出。 TCC 事務機制相比于上面介紹的 XA,解決了其幾個缺點:
TCC 其實就是采用的補償機制,其核心思想是:針對每個操作,都要注冊一個與其對應的確認和補償(撤銷)操作。TCC 模型完全交由業(yè)務實現(xiàn),每個子業(yè)務都需要實現(xiàn) Try-Confirm-Cancel 三個接口,對業(yè)務侵入大,資源鎖定交由業(yè)務方。
- Try 階段:嘗試執(zhí)行,完成所有業(yè)務檢查(一致性), 預留必需業(yè)務資源(準隔離性)。
- Confirm 階段:確認執(zhí)行真正執(zhí)行業(yè)務,不作任何業(yè)務檢查,只使用 Try 階段預留的業(yè)務資源,Confirm 操作滿足冪等性。要求具備冪等設計,Confirm 失敗后需要進行重試。
- Cancel 階段:取消執(zhí)行,釋放 Try 階段預留的業(yè)務資源 Cancel 操作滿足冪等性 Cancel 階段的異常和 Confirm 階段異常處理方案基本上一致。
一個完整的業(yè)務活動由一個主業(yè)務服務與若干子業(yè)務服務組成:
比如一個轉賬操作:
基于 TCC 實現(xiàn)分布式事務,會將原來只需要一個接口就可以實現(xiàn)的邏輯拆分為 Try、Confirm、Cancel 三個接口,所以代碼實現(xiàn)復雜度相對較高,需要在業(yè)務中寫很多的補償機制代碼。
TCC將事務提交劃分成兩個階段,Try即為一階段,Confirm 和 Cancel 是二階段并行的兩個分支,二選一。從階段劃分上非常像2PC,我們是否可以說TCC是一種2PC或者2PC變種呢?
對比一下 XA 事務模型,TCC 的兩階段提交與 XA 還是有一些區(qū)別:
本地消息表#
本地消息表最初是由eBay架構師Dan Pritchett在一篇解釋 BASE 原理的論文《Base:An Acid Alternative》(https://queue.acm.org/detail.cfm?id=1394128)中提及的,業(yè)界目前使用這種方案是比較多的,其核心思想是將分布式事務拆分成本地事務進行處理。
方案通過在事務主動發(fā)起方額外新建事務消息表,事務發(fā)起方處理業(yè)務和記錄事務消息在本地事務中完成,輪詢事務消息表的數(shù)據(jù)發(fā)送事務消息,事務被動方基于消息中間件消費事務消息表中的事務。
基于本地消息表的方案,每個事務發(fā)起方都需要額外新建事務消息記錄表,用于記錄分布式事務的消息的發(fā)生、處理狀態(tài)。
事務發(fā)起方在處理完業(yè)務邏輯之后需要將當前事務保存在消息表中,之后將消息發(fā)送到消息中間件中,并將消息的狀態(tài)設置為 “發(fā)送中”。
如果消息在投遞過程中丟失怎么辦呢?事務發(fā)起方可以設置一個定時任務主動掃描狀態(tài)為 “發(fā)送中” 的消息重新投送。只有消息被業(yè)務方消費完畢返回消費成功的結果才確認成功并將消息狀態(tài)改為“已發(fā)送”。
這里因為網(wǎng)絡異常或者發(fā)送異常導致一個消息可能會被重復發(fā)送,所以要求接收方要做到冪等性,允許重復消費。
這種方案的好處就是方案簡單,成本較低,實現(xiàn)也不復雜。
但是壞處也有很多,比如通過消息的方式延遲不好控制;本地消息表與業(yè)務耦合在一起沒有做到通用性;本地消息表基于數(shù)據(jù)庫來實現(xiàn),有一定的瓶頸。
事務消息#
上面說的本地消息表的模式無法支持本地事務執(zhí)行和消息發(fā)送一致性的問題,如果能在本地事務執(zhí)行和發(fā)消息這兩個操作上加上事務,那豈不是完美。
基于這個思路, 在 MQ 中存儲消息的狀態(tài)才是真理,消息生產(chǎn)者先把消息發(fā)送給MQ,此時消息狀態(tài)為“待確認”,接著生產(chǎn)者去執(zhí)行本地事務,如果執(zhí)行成功就給MQ發(fā)送消息讓他更改消息狀態(tài)為 “待發(fā)送”并發(fā)送消息,如果執(zhí)行失敗則刪除消息。
這樣就保證了本地事務和消息發(fā)送一致性問題。
注意點:由于MQ通常都會保證消息能夠投遞成功,因此,如果業(yè)務沒有及時返回ACK結果,那么就有可能造成MQ的重復消息投遞問題。因此,對于消息最終一致性的方案,消息的消費者必需要對消息的消費支持冪等,不能造成同一條消息的重復消費的情況。
SAGA 事務模型#
Saga是什么?Saga的定義是 “長時間活動的事務 ”(Long Lived Transaction,后文簡稱為LLT)。他是普林斯頓大學 HECTOR GARCIA-MOLINA 教授在1987年的一篇關于分布式數(shù)據(jù)庫的論文中提出來的概念。
Long Lived 從字面意義上不清晰,Long 到底意味著多長?事務持續(xù)時間是一個小時、一天甚至一周嗎?其實都不是,時間跨度并不重要。重要的是什么?關鍵的是跨系統(tǒng)的多次“事務”,Saga 往往由多個外部的事務構成,需要通過多次外部系統(tǒng)的消息交互,才能將整體事務從開始遷移到結束狀態(tài),這和我們原來常見的在一個數(shù)據(jù)庫的短事務不一樣。比如一個旅行的訂單,是由機票、旅館、租車三個子訂單構成,都需要外部的確認,缺任何一個步驟,不能成行,這就是一個典型的 LLT。
看起來 Sage 的定義與別的分布式事務沒有什么不同。分布式事務不就是多個不同的子事務構成一個整體嗎?再來看看 補償機制:
每個本地事務有相應的執(zhí)行模塊和補償模塊,當 Sage 事務中的任意一個本地事務出錯, 可以通過調用相關事務對應的補償方法恢復,達到事務的最終一致性。
Saga 模型是把一個分布式事務拆分為多個本地事務,每個本地事務都有相應的執(zhí)行模塊和補償模塊(對應TCC 中的 Confirm 和 Cancel),當 Saga 事務中任意一個本地事務出錯時,可以通過調用相關的補償方法恢復之前的事務,達到事務最終一致性。
由于 Saga 模型中沒有 Prepare 階段,因此事務間不能保證隔離性,當多個 Saga 事務操作同一資源時,就會產(chǎn)生更新丟失、臟數(shù)據(jù)讀取等問題,這時需要在業(yè)務層控制并發(fā),例如:
- 在應用層面加鎖;
- 應用層面預先凍結資源。
Saga 恢復方式
Saga 支持向前和向后恢復:
- 向后恢復:補償所有已完成的事務,如果任一的事務失敗;
- 向前恢復:重試失敗的事務,假設每個子事務最終都會成功。
雖然 Saga 和 TCC 都是補償事務,但是由于提交階段不同,所以兩者也是有不同的:
- Saga 沒有 Try 行為直接 Commit,所以會留下原始事務操作的痕跡,Cancel 屬于不完美補償,需要考慮對業(yè)務上的影響。TCC Cancel 是完美補償?shù)?Rollback,補償操作會徹底清理之前的原始事務操作,用戶是感知不到事務取消之前的狀態(tài)信息的。
- Saga 的補償操作通常可以異步執(zhí)行,TCC 的 Cancel 和 Confirm 可以跟進需要是否異步化。
- Saga 對業(yè)務侵入較小,只需要提供一個逆向操作的 Cancel 即可;而 TCC 需要對業(yè)務進行全局性的流程改造。
- TCC 最少通信次數(shù)為 2n,而 Saga 為 n(n=子事務的數(shù)量)。
因為也是采用補償機制,那么必然要求服務保持冪等性,如果服務調用超時需要通過冪等性來避免多次請求帶來的問題。
事務特性的滿足:
原子性:Saga 協(xié)調器保證整體事務要么全部執(zhí)行成功,要么全部回滾。
一致性:Sage 保證最終一致性。
持久性:Saga 將整體事務拆分成獨立的本地事務,所以持久性在本地事務中很好實現(xiàn)。
但是隔離性 Saga 無法實現(xiàn),因為大事務被拆分為多個小事務,每個事務提交的時機不同很難保證已提交的小事務不被別人可見。
目前業(yè)界提供兩類 Saga 的實現(xiàn)方式:
- 一種是集中式協(xié)調的實現(xiàn)方式。集中式協(xié)調方式就是通過一個 Saga 對象來追蹤所有的 Saga 子任務的調用,由它來管理,追蹤整個事務是否應該提交或補償。這種方式帶來的缺點就是這種協(xié)調方式必然要與第一個Saga 事務耦合,即與業(yè)務耦合在一起。
- 一種是分布式實現(xiàn)方式。分布式協(xié)調方式肯定就能避免耦合的問題。分布式實現(xiàn)的方案也很多,比如通過事件機制來實現(xiàn),一條 Saga 事務鏈上的所有事務都訂閱同一個事件,如果失敗則通過失敗對應的事件消息來回滾即可。這種方式帶來的好處肯定是顯而易見的,但是也會有另一個問題,多個事件帶來的肯定是高并發(fā)的處理,那么會不會因為多個事件處理相關的問題帶來一些循環(huán)依賴的問題。
開源分布式事務框架簡介#
Seata
Seata(Simple Extensible Autonomous Transaction Architecture,簡單可擴展自治事務框架)是 2019 年 1 月份螞蟻金服和阿里巴巴共同開源的分布式事務解決方案。
Seata 會有 4 種分布式事務解決方案,分別是 AT 模式、TCC 模式、Saga 模式和 XA 模式。
XA 模式
XA 模式是 Seata 將會開源的另一種無侵入的分布式事務解決方案,任何實現(xiàn)了 XA 協(xié)議的數(shù)據(jù)庫都可以作為資源參與到分布式事務中,目前主流數(shù)據(jù)庫,例如 MySql、Oracle、DB2、Oceanbase 等均支持 XA 協(xié)議。
XA 協(xié)議有一系列的指令,分別對應一階段和二階段操作。“xa start” 和 “xa end” 用于開啟和結束XA 事務;“xa prepare” 用于預提交 XA 事務,對應一階段準備;“xa commit”和“xa rollback”用于提交、回滾 XA 事務,對應二階段提交和回滾。
在 XA 模式下,每一個 XA 事務都是一個事務參與者。分布式事務開啟之后,首先在一階段執(zhí)行“xa start”、“業(yè)務 SQL”、“xa end”和 “xa prepare” 完成 XA 事務的執(zhí)行和預提交;二階段如果提交的話就執(zhí)行 “xa commit”,如果是回滾則執(zhí)行“xa rollback”。這樣便能保證所有 XA 事務都提交或者都回滾。
XA 模式下,用戶只需關注自己的“業(yè)務 SQL”,Seata 框架會自動生成一階段、二階段操作;XA 模式的實現(xiàn)如下:
- 一階段:
在 XA 模式的一階段,Seata 會攔截“業(yè)務 SQL”,在“業(yè)務 SQL”之前開啟 XA 事務(“xa start”),然后執(zhí)行“業(yè)務 SQL”,結束 XA 事務“xa end”,最后預提交 XA 事務(“xa prepare”),這樣便完成 “業(yè)務 SQL”的準備操作。
- 二階段提交:
執(zhí)行“xa commit”指令,提交 XA 事務,此時“業(yè)務 SQL”才算真正的提交至數(shù)據(jù)庫。
- 二階段回滾:
執(zhí)行“xa rollback”指令,回滾 XA 事務,完成“業(yè)務 SQL”回滾,釋放數(shù)據(jù)庫鎖資源。
XA 模式下,用戶只需關注“業(yè)務 SQL”,Seata 會自動生成一階段、二階段提交和二階段回滾操作。XA 模式和 AT 模式一樣是一種對業(yè)務無侵入性的解決方案;但與 AT 模式不同的是,XA 模式將快照數(shù)據(jù)和行鎖等通過 XA 指令委托給了數(shù)據(jù)庫來完成,這樣 XA 模式實現(xiàn)更加輕量化。
AT 模式
AT 模式是一種無侵入的分布式事務解決方案。在 AT 模式下,用戶只需關注自己的“業(yè)務 SQL”,用戶的 “業(yè)務 SQL” 作為一階段,Seata 框架會自動生成事務的二階段提交和回滾操作。
AT 模式的一階段、二階段提交和回滾
均由 Seata 框架自動生成,用戶只需編寫“業(yè)務 SQL”,便能輕松接入分布式事務,AT 模式是一種對業(yè)務無任何侵入的分布式事務解決方案。
TCC 模式
2019 年 3 月份,Seata 開源了 TCC 模式,該模式由螞蟻金服貢獻。TCC 模式需要用戶根據(jù)自己的業(yè)務場景實現(xiàn) Try、Confirm 和 Cancel 三個操作;事務發(fā)起方在一階段 執(zhí)行 Try 方式,在二階段提交執(zhí)行 Confirm 方法,二階段回滾執(zhí)行 Cancel 方法。
TCC 三個方法描述:
- Try:資源的檢測和預留;
- Confirm:執(zhí)行的業(yè)務操作提交;要求 Try 成功 Confirm 一定要能成功;
- Cancel:預留資源釋放。
用戶接入 TCC 模式,最重要的事情就是考慮如何將業(yè)務模型拆成 2 階段,實現(xiàn)成 TCC 的 3 個方法,并且保證 Try 成功 Confirm 一定能成功。相對于 AT 模式,TCC 模式對業(yè)務代碼有一定的侵入性,但是 TCC 模式無 AT 模式的全局行鎖,TCC 性能會比 AT 模式高很多。
Saga 模式
Saga 模式是 Seata 即將開源的長事務解決方案,將由螞蟻金服主要貢獻。在 Saga 模式下,分布式事務內有多個參與者,每一個參與者都是一個沖正補償服務,需要用戶根據(jù)業(yè)務場景實現(xiàn)其正向操作和逆向回滾操作。
分布式事務執(zhí)行過程中,依次執(zhí)行各參與者的正向操作,如果所有正向操作均執(zhí)行成功,那么分布式事務提交。如果任何一個正向操作執(zhí)行失敗,那么分布式事務會去退回去執(zhí)行前面各參與者的逆向回滾操作,回滾已提交的參與者,使分布式事務回到初始狀態(tài)。
Saga 模式下分布式事務通常是由事件驅動的,各個參與者之間是異步執(zhí)行的,Saga 模式是一種長事務解決方案。
ServiceComb
ServiceComb 是華為開源的微服務框架,目前已升級為 Apache 頂級項目。 準確來說它并不是一個純粹的分布式事務框架而是微服務框架,最開始的版本是 Go 語言,后面支持了 Java。
ServiceComb 由 3 個子項目組成:
- java-chassis:服務治理
- service-center:服務注冊
- saga:分布式事務解決
從名字上看很顯然是基于 Saga 模式開發(fā)的柔性事務方案。Saga系統(tǒng)分為兩部分:Alpha 和 Omega。Alpha 是獨立的服務,扮演事務協(xié)調器的作用。Omega 作為開發(fā)組件,和業(yè)務進程運行在一起。
Omega 會以切面編程的方式向應用程序注入相關的處理模塊。這里有攔截請求的模塊, 用來幫助我們構建分布式事務調用的上下文。 同時在事務處理初始階段處理事務的相關準備的操作,例如創(chuàng)建 Saga 起始事件,以及相關的的起始事件, 根據(jù)事務的執(zhí)行的成功或者失敗生產(chǎn)相關的事務終止或者失敗事件。
Omega 會與 Alpha 進行鏈接會把這些事件通知給 Alpha。 Alpha 可以在后臺進行分析,根據(jù) Saga 事務執(zhí)行的情況給 Omega 下達相關的指令進行相關的回滾恢復。
這樣設計的好處是 Saga 實現(xiàn)代碼與用戶的代碼分離, 用戶只需要添加幾個 annotation,Saga 實現(xiàn)就能 Saga 事件的執(zhí)行情況并進行相關的處理。
作者: rickiyang
原文鏈接:https://www.cnblogs.com/rickiyang/p/13704868.html
如果感覺本文對你有幫助,幫忙關注轉發(fā)支持一下
總結
以上是生活随笔為你收集整理的oledb 访问接口sqlncli10返回了消息 没有活动事务_这样理解分布式事务你是不是就会懂了?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c 结构体在声明时赋值_Java基础知识
- 下一篇: filezilla 设置filezill