偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

微服務架構下分布式事務處理方案選擇和對比

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

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

因此有必要對分布式事務整體解決思路進行下總結。

分布式事務概述

圖片圖片

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

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

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

1.跨資源

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

2.資源+服務組合

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

3.跨服務

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

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

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

圖片圖片

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

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

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

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

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

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

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

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

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

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

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

弱一致性-事務補償模型

圖片圖片

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

工作方式和限制

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

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

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

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

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

事務補償場景舉例

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

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

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

圖片圖片

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

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

以上即是對事務補償機制的關鍵說明。

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,可用性,好的響應性能。完全的可用性指的是在任何故障模型下,服務都會在有限的時間內(nèi)處理完成并進行響應。
  • P: Partition tolerance,分區(qū)容忍性。盡管網(wǎng)絡上有部分消息丟失,但系統(tǒng)仍然可繼續(xù)工作。

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

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

從CAP理論到BASE理論

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

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

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

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

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

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ù)庫常用的概念設計,追求強一致性模型。

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

圖片圖片

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

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

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

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

場景舉例說明

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

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

圖片圖片

三種事務處理方案的比較和選擇

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

圖片圖片

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

圖片圖片

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

兩種方法選擇思路為:

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

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

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

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

責任編輯:武曉燕 來源: 人月聊IT
相關推薦

2022-06-13 10:42:21

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

2014-01-22 13:37:53

2021-09-03 10:37:35

分布式事務處理

2014-02-11 09:07:31

2009-02-05 11:39:41

Oracle甲骨文Tuxedo

2015-03-18 09:33:41

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

2021-09-28 09:43:11

微服務架構技術

2019-07-30 07:26:26

技術分布式指標

2015-03-16 14:38:16

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

2019-11-18 10:19:02

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

2010-04-13 15:44:00

Oracle與SqlS

2023-08-16 11:43:57

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

2023-12-07 08:37:49

TCC模式

2023-11-01 10:11:00

Java分布式

2009-07-15 17:41:55

iBATIS事務處理

2011-04-27 15:55:16

2023-09-12 22:58:51

分布式架構微服務

2020-05-28 09:35:05

分布式事務方案

2017-09-19 09:36:24

微服務架構分布式

2009-07-09 18:15:42

JDBC事務處理
點贊
收藏

51CTO技術棧公眾號