自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

微服務(wù)架構(gòu)下分布式事務(wù)處理方案選擇和對比

開發(fā) 架構(gòu)
對于不能采用BASE事務(wù)最終一致性的地方,特別是在ServiceB在調(diào)用的時候存在較多的業(yè)務(wù)邏輯校驗,因此ServiceA即使調(diào)用成功也會經(jīng)常出現(xiàn)由于邏輯校驗導(dǎo)致ServiceB調(diào)用不成功,那么這種情況下就很難用BASE方案,否則就會導(dǎo)致大量的人工補償操作和處理。

在微服務(wù)架構(gòu)下,我們最容易遇到的一個問題就是分布式事務(wù)處理問題,當你微服務(wù)模塊拆分越細,那么遇到分布式事務(wù)處理的場景就越多。即使是同一個微服務(wù)模塊,對應(yīng)一個業(yè)務(wù)數(shù)據(jù)庫,但是你某個業(yè)務(wù)邏輯的實現(xiàn)是調(diào)用兩個Service接口服務(wù)來完成的,同樣也是分布式事務(wù)問題。

因此有必要對分布式事務(wù)整體解決思路進行下總結(jié)。

分布式事務(wù)概述

圖片圖片

分布式事務(wù)就是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點之上。簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的服務(wù)器上,且屬于不同的應(yīng)用,分布式事務(wù)需要保證這些小操作要么全部成功,要么全部失敗。本質(zhì)上來說,分布式事務(wù)就是為了保證不同數(shù)據(jù)庫的數(shù)據(jù)一致性。

一個分布式事務(wù)包含一組操作序列,由兩個或兩個以上的網(wǎng)絡(luò)主機參與。通常主機提供事務(wù)性資源,而事務(wù)管理器負責創(chuàng)建和管理全局事務(wù),由事務(wù)管理器協(xié)調(diào)事務(wù)參與的資源。分布式事務(wù)和本地事務(wù)并無太大不同,也需保證事務(wù)的四個屬性(原子性、一致性、隔離性、持久性)。

對于分布式事務(wù)的潛在場景,可以簡單的分為三類:

1.跨資源

一個完整業(yè)務(wù)需要操作兩個獨立數(shù)據(jù)庫,比如需要在A數(shù)據(jù)庫插入一條訂單記錄,同時更新B數(shù)據(jù)庫中的庫存狀態(tài),兩個操作跨數(shù)據(jù)庫,但是需要控制在一個完整事務(wù)里面。

2.資源+服務(wù)組合

在和工作流集成場景中出現(xiàn),業(yè)務(wù)用戶在提交單據(jù)的時候需要后臺執(zhí)行兩個操作,首先是調(diào)用本地API將單據(jù)數(shù)據(jù)保存到本地數(shù)據(jù)庫,其次是調(diào)用啟動流程WebService服務(wù)。

3.跨服務(wù)

由于Web Service服務(wù)本身無狀態(tài),即使是同一個數(shù)據(jù)庫提供給處理的兩個WebService服務(wù),在進行調(diào)用和組合的時候也屬于分布式事務(wù)控制。

對于分布式事務(wù)的主流解決方法,主要包括了XA兩階段提交,事務(wù)補償和基于BASE的最終一致性(可靠消息傳輸),首先再對這三種方法做下簡單描述。

強一致性-兩階段提交模型

圖片圖片

兩階段提交,因為它是實現(xiàn)XA分布式事務(wù)的關(guān)鍵(確切地說:兩階段提交主要保證了分布式事務(wù)的原子性:即所有節(jié)點要么全做要么全不做)。所謂的兩個階段是指:第一階段:準備階段和第二階段:提交階段。具體過程如下:

階段一:開始向事務(wù)涉及到的全部資源發(fā)送提交前信息

此時,事務(wù)涉及到的資源還有最后一次機會來結(jié)束事務(wù)。如果任意一個資源決定異常結(jié)束事務(wù),則整個事務(wù)取消,不會進行資源的更新。否則,事務(wù)將正常執(zhí)行,除非發(fā)生災(zāi)難性的失敗。為了防止會發(fā)生災(zāi)難性的失敗,所有資源的更新都會寫入到日志中。這些日志是永久性的,因此,這些日志會幸免于難并且在失敗之后可以重新對所有資源進行更新。

階段二:只在階段一沒有異常結(jié)束的時候才會發(fā)生

此時,所有能被定位和單獨控制的資源管理器都將開始執(zhí)行真正的數(shù)據(jù)更新。事務(wù)管理器將基于第一個階段的投票結(jié)果進行決策:提交或取消。當所有的參與者同意提交事務(wù)協(xié)調(diào)者才通知所有的參與者提交事務(wù),否則協(xié)調(diào)者將通知所有的參與者取消事務(wù)。

從以上工作過程可以看出,兩階段提交協(xié)議正確工作的前提假設(shè)是每個節(jié)點都會記錄來寫前日志(write-ahead log)并持久性存儲,即使節(jié)點發(fā)生故障日志也不會丟失。同時假設(shè)節(jié)點不會發(fā)生永久性故障而且任意兩個節(jié)點都可以互相通信。

兩階段提交優(yōu)缺點分析

兩階段提交協(xié)議最大的劣勢是其通過阻塞完成的協(xié)議,在事務(wù)參與者等待消息的時候處于阻塞狀態(tài),事務(wù)參與者中其他進程則需要等待阻塞進程釋放資源才能使用。如果事務(wù)管理器發(fā)生了故障,那么事務(wù)參與者將無法完成事務(wù)則一直等待下去。同時兩階段提交協(xié)議沒有容錯機制,一個節(jié)點發(fā)生故障整個事務(wù)都要回滾,代價比較大。

兩階段提交協(xié)議僅在一種情況下可能導(dǎo)致數(shù)據(jù)不一致,所有或部分參與者都響應(yīng)了Prepare階段,在任何參與者收到事務(wù)管理器提交或回滾決定之前事務(wù)管理器宕機死亡,此時所有參與者都必須等待事務(wù)管理器恢復(fù)。而可能事務(wù)管理器此時已經(jīng)丟失了事務(wù)上下文,這時需人工介入?yún)⑴c數(shù)據(jù)恢復(fù)。

兩階段提交協(xié)議僅僅是提供了分布式事務(wù)中的原子性屬性,保證一個事務(wù)在全局要么全部提交,要么全部回滾,但是在并發(fā)控制上(隔離性),仍然需要封鎖協(xié)議,為了達到分布式環(huán)境下全局串行和避免一個事務(wù)的失敗可能引起一連串事務(wù)的回滾,通常使用強兩階段封鎖協(xié)議(SS2PL)。

兩階段封鎖協(xié)議并不保證不會發(fā)生死鎖,數(shù)據(jù)庫系統(tǒng)必須采取其他的措施,預(yù)防和解決死鎖問題。但常見的數(shù)據(jù)庫系統(tǒng)通常都實現(xiàn)了隔離級別,不同的隔離級別對于不同的鎖機制,下表列出他們的對應(yīng)關(guān)系。值得一提的是,兩階段封鎖協(xié)議并不保證不會發(fā)生死鎖,數(shù)據(jù)庫系統(tǒng)必須采取其他的措施,預(yù)防和解決死鎖問題。所以說,如果兩階段提交協(xié)議中事務(wù)時間越長,那么鎖等待的時間和死鎖的概率也會變大。

弱一致性-事務(wù)補償模型

圖片圖片

事務(wù)補償機制是指在事務(wù)鏈中的任何一個正向事務(wù)操作,都必須存在一個完全符合回滾規(guī)則的可逆事務(wù)。例如存款操作通過取款操作來補償、買入通過賣出來補償。

工作方式和限制

這里的“補償”與數(shù)據(jù)庫事務(wù)中的“回滾”是有區(qū)別的,“回滾”是指操作的取消,“回滾”前后對外界來講,數(shù)據(jù)是一致的。而“補償”則是獨立的逆向操作,如果事務(wù)執(zhí)行了“補償操作”,外界可能會看到數(shù)據(jù)的兩種狀態(tài)。從這個角度講,“回滾”需要鎖定資源。從數(shù)據(jù)庫操作上來“補償操作”其實也是一次短事務(wù)。而“回滾”是一個事務(wù)內(nèi)的操作。

事務(wù)補償通常在實現(xiàn)時采取嵌套事務(wù)的方式,即把一個主事務(wù)拆分成多個從業(yè)務(wù)操作,事務(wù)的發(fā)起和結(jié)束由主事務(wù)完成。從業(yè)務(wù)服務(wù)提供的業(yè)務(wù)操作提供補償操作,補償操作可以抵銷(或部分抵銷)正向業(yè)務(wù)操作的業(yè)務(wù)結(jié)果。業(yè)務(wù)活動管理器控制業(yè)務(wù)活動的一致性,它登記業(yè)務(wù)活動中的操作,并在業(yè)務(wù)活動取消時調(diào)用補償操作。具體回滾整個事務(wù)還是回退到某個事務(wù)點,可以依據(jù)具體業(yè)務(wù)來處理。

在上面方式中可以看到需要手工編寫大量的代碼來處理以保證事務(wù)的完整性,我們可以考慮實現(xiàn)一個通用的事務(wù)管理器,實現(xiàn)事務(wù)鏈和事務(wù)上下文的管理。對于事務(wù)鏈上的任何一個服務(wù)正向和逆向操作均在事務(wù)管理和協(xié)同器上注冊,由事務(wù)管理器接管所有的事務(wù)補償和回滾操作。

補償機制能正確工作是基于事務(wù)是可以補償這一前提,如果這一前提無法滿足,那么就無法使用這一機制?,F(xiàn)實業(yè)務(wù)場景中,確實存在這樣的業(yè)務(wù),例如證券交易,因為對時效性特別敏感,不能簡單地使用賣出(買入)來補償買入(賣出),因為不同時間交易的價格可能差距很大。

另外,補償操作也是一次事務(wù)操作,考慮到補償操作也是有可能失敗的,所以,補償操作應(yīng)該支持重試,這就要求補償操作滿足冪等性。即重復(fù)調(diào)用多次產(chǎn)生的業(yè)務(wù)結(jié)果與調(diào)用一次產(chǎn)生的業(yè)務(wù)結(jié)果相同。

事務(wù)補償場景舉例

在前面已經(jīng)強調(diào)了,對于事務(wù)補償必須滿足冪等性要求,而且不能對時效性太敏感。

場景:采購訂單在提交時候調(diào)用預(yù)算檢查和扣減,但是如果單據(jù)保存失敗需要再次調(diào)用預(yù)算檢查和調(diào)整,將扣減預(yù)算退回。

那么基于以上場景事務(wù)補償?shù)暮诵膶崿F(xiàn)邏輯如下:

圖片圖片

  • 正常情況,調(diào)用預(yù)算扣減服務(wù)后,保存采購訂單,兩者需要同時成功
  • 如果調(diào)用采購訂單保存服務(wù)出現(xiàn)失敗,那么就需要對已經(jīng)扣減的預(yù)算進行補償和返還

即調(diào)用和扣減預(yù)算完全對等的一個逆向操作,將扣減服務(wù)造成的影響全部回退

以上即是對事務(wù)補償機制的關(guān)鍵說明。

BASE最終一致性-可靠消息隊列

CAP理論概述

圖片圖片

由于對系統(tǒng)或者數(shù)據(jù)進行了拆分,我們的系統(tǒng)不再是單機系統(tǒng),而是分布式系統(tǒng),針對分布式系統(tǒng)的CAP原理包含如下三個元素。

  • C:Consistency,一致性。在分布式系統(tǒng)中的所有數(shù)據(jù) 備份,在同一時刻具有同樣的值,所有節(jié)點在同一時刻讀取的數(shù)據(jù)都是最新的數(shù)據(jù)副本。
  • A:Availability,可用性,好的響應(yīng)性能。完全的可用性指的是在任何故障模型下,服務(wù)都會在有限的時間內(nèi)處理完成并進行響應(yīng)。
  • P: Partition tolerance,分區(qū)容忍性。盡管網(wǎng)絡(luò)上有部分消息丟失,但系統(tǒng)仍然可繼續(xù)工作。

CAP原理指的是,這三個要素最多只能同時實現(xiàn)兩點,不可能三者兼顧。因此在進行分布式架構(gòu)設(shè)計時,必須做出取舍。而對于分布式數(shù)據(jù)系統(tǒng),分區(qū)容忍性是基本要求,否則就失去了價值。因此設(shè)計分布式數(shù)據(jù)系統(tǒng),就是在一致性和可用性之間取一個平衡。

當然,犧牲一致性,并不是完全不管數(shù)據(jù)的一致性,否則數(shù)據(jù)是混亂的,那么系統(tǒng)可用性再高分布式再好也沒有價值。犧牲一致性,只是不再要求關(guān)系型數(shù)據(jù)庫中的強一致性,而是只要系統(tǒng)能達到最終一致性即可。

從CAP理論到BASE理論

BASE 是 Basically Available(基本可用)、Soft state(軟狀態(tài))和 Eventually consistent(最終一致性)三個短語的簡寫,由 eBay 架構(gòu)師 Dan Pritchett 于 2008 年在《BASE: An Acid Alternative》論文中首次提出。

BASE 思想與 ACID 原理截然不同,它滿足 CAP 原理,通過犧牲強一致性獲得可用性, 一般應(yīng)用于服務(wù)化系統(tǒng)的應(yīng)用層或者大數(shù)據(jù)處理系統(tǒng)中,通過達到最終一致性來盡量滿足業(yè)務(wù)的絕大多數(shù)需求。BASE 模型包含如下三個元素:

  • BA:(Basically Available ),基本可用。
  • S:( Soft State),軟狀態(tài),狀態(tài)可以在一段時間內(nèi)不同步。
  • E:(Eventually Consistent ),最終一致,在一定的時間窗口內(nèi), 最終達成一致即可。

BASE理論是基于CAP定理演化而來,是對CAP中一致性和可用性權(quán)衡的結(jié)果。核心思想:即使無法做到強一致性,但每個業(yè)務(wù)根據(jù)自身的特點,采用適當?shù)姆绞絹硎瓜到y(tǒng)達到最終一致性。

1、基本可用:指分布式系統(tǒng)在出現(xiàn)故障的時候,允許損失部分可用性,保證核心可用。但不等價于不可用。比如:搜索引擎0.5秒返回查詢結(jié)果,但由于故障,2秒響應(yīng)查詢結(jié)果;網(wǎng)頁訪問過大時,部分用戶提供降級服務(wù),等。

2、軟狀態(tài):軟狀態(tài)是指允許系統(tǒng)存在中間狀態(tài),并且該中間狀態(tài)不會影響系統(tǒng)整體可用性。即允許系統(tǒng)在不同節(jié)點間副本同步的時候存在延時。

3、最終一致性:系統(tǒng)中的所有數(shù)據(jù)副本經(jīng)過一定時間后,最終能夠達到一致的狀態(tài),不需要實時保證系統(tǒng)數(shù)據(jù)的強一致性。最終一致性是弱一致性的一種特殊情況。

BASE理論面向的是大型高可用可擴展的分布式系統(tǒng),通過犧牲強一致性來獲得可用性。ACID是傳統(tǒng)數(shù)據(jù)庫常用的概念設(shè)計,追求強一致性模型。

基于可靠消息隊列實現(xiàn)最終一致性

圖片圖片

基于消息的最終一致性是消除了分布式事務(wù),是一種在BASE思想指導(dǎo)下比較好的方案。這種方案實現(xiàn)了兩個服務(wù)之間的解耦,解耦的關(guān)鍵就是異步消息和消息持久化機制。在兩個服務(wù)調(diào)用之間,會存在一個真空期,這段時間相關(guān)數(shù)據(jù)不一致,而只是在一個事務(wù)的中間狀態(tài)。

事務(wù)主動方的業(yè)務(wù)服務(wù)事務(wù)提交和消息發(fā)送之間必須通過事務(wù)同步,可以通過事務(wù)管理器進行管理,如兩階段提交。事務(wù)主動方在完成事務(wù)提交和消息發(fā)送之后,它的最終處理結(jié)果不再受到事務(wù)被動方的影響。即發(fā)送到事務(wù)被動方的事務(wù)要么成功,要么重試。

所以,消息同樣需要滿足冪等性。實際情況下,消息很難具有冪等性,解決這一問題的方法是使用另一個表記錄已經(jīng)被成功應(yīng)用的消息,這樣就可以通過避免消息多次被應(yīng)用,從而達到冪等性。

在實際應(yīng)用中,如果消息接收端的服務(wù)出現(xiàn)失敗,可能需要人工干預(yù)。

場景舉例說明

場景:在采購系統(tǒng)中擬制采購訂單,在提交單據(jù)申請的時候既需要將單據(jù)成功保存到本地,同時又需要啟動遠程流程平臺提供的流程啟動服務(wù)。在該場景中,第二個步驟屬于必須要最終完成的操作,同時業(yè)務(wù)上也允許最終一致(不要因為流程平臺本身問題導(dǎo)致單據(jù)提交不成功,啟動流程失敗如何重試是系統(tǒng)內(nèi)部的事情)

對于該場景,基于消息實現(xiàn)最終一致性邏輯如下:

圖片圖片

三種事務(wù)處理方案的比較和選擇

對于上面談到的三種事務(wù)處理方案,我們列個表格比較如下:

圖片圖片

當前主流的方法仍然是事務(wù)補償和BASE最終一致性,同時可以看到,基于消息中間件實現(xiàn)的事務(wù)最終一致性由于本身具備高可靠,高性能,并滿足大并發(fā)的高吞吐量,因此在互聯(lián)網(wǎng)應(yīng)用往往采用的更加多。在企業(yè)內(nèi)部的基于SOA服務(wù)的分布式事務(wù)控制,

圖片圖片

場景:業(yè)務(wù)操作需要同時調(diào)用 ServiceA-》ServiceB 兩個服務(wù),并控制到一個分布式事務(wù)里面。

兩種方法選擇思路為:

If ( 服務(wù)A是否可以完整設(shè)計出 –A補償服務(wù))
{
  //-A補償服務(wù)能夠保證A服務(wù)影響完整回退
  //在調(diào)用-A前,A服務(wù)調(diào)用影響不會波及到后續(xù)操作
  if(服務(wù)A成功 則 服務(wù)B調(diào)用必須成功
        and B只要最終成功即可)
  {
       //在服務(wù)A成功的情況下服務(wù)B不存在因業(yè)務(wù)邏輯處理和校驗導(dǎo)致的不成功。
       Choose 最終一致性方案;(優(yōu)選方案)
  }
  Else
  {
      Choose 事務(wù)補償方案;
  }
}
Else
{
     Choose 最終一致性方案;
}

整體思路也就是說能夠采用最終一致性的地方盡量采用最終一致性來解決問題。

對于不能采用BASE事務(wù)最終一致性的地方,特別是在ServiceB在調(diào)用的時候存在較多的業(yè)務(wù)邏輯校驗,因此ServiceA即使調(diào)用成功也會經(jīng)常出現(xiàn)由于邏輯校驗導(dǎo)致ServiceB調(diào)用不成功,那么這種情況下就很難用BASE方案,否則就會導(dǎo)致大量的人工補償操作和處理。

對于ServiceB的調(diào)用如果需求都是最終一致,同時ServiceB的調(diào)用不存在由于業(yè)務(wù)原因?qū)е碌恼{(diào)用失敗,那么都建議采用BASE事務(wù)最終一致性方案。由于BASE方案基于消息中間件來實現(xiàn),通過消息中間件既可以實現(xiàn)大并發(fā)下的吞吐量,同時也可以實現(xiàn)兩個服務(wù)調(diào)用間的徹底解耦。

責任編輯:武曉燕 來源: 人月聊IT
相關(guān)推薦

2022-06-13 10:42:21

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

2014-01-22 13:37:53

2021-09-03 10:37:35

分布式事務(wù)處理

2014-02-11 09:07:31

2009-02-05 11:39:41

Oracle甲骨文Tuxedo

2015-03-18 09:33:41

大數(shù)據(jù)分布式系統(tǒng)事務(wù)處理

2021-09-28 09:43:11

微服務(wù)架構(gòu)技術(shù)

2019-07-30 07:26:26

技術(shù)分布式指標

2015-03-16 14:38:16

大數(shù)據(jù)存儲分布式系統(tǒng)事務(wù)處理

2019-11-18 10:19:02

分布式系統(tǒng)事務(wù)模型

2010-04-13 15:44:00

Oracle與SqlS

2023-08-16 11:43:57

數(shù)據(jù)引擎

2023-11-01 10:11:00

Java分布式

2023-12-07 08:37:49

TCC模式

2009-07-15 17:41:55

iBATIS事務(wù)處理

2011-04-27 15:55:16

2023-09-12 22:58:51

分布式架構(gòu)微服務(wù)

2020-05-28 09:35:05

分布式事務(wù)方案

2017-09-19 09:36:24

微服務(wù)架構(gòu)分布式

2009-07-09 18:15:42

JDBC事務(wù)處理
點贊
收藏

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