關於分散式交易、兩階段交易認可、一階段提交、Best Efforts 1PC模式和事務補償機制的研究[轉]

來源:互聯網
上載者:User

標籤:dubbo+zookeeper   dubbo分布式服務   dubbo+springmvc+mybatis   redis分布式緩衝   maven+springmvc   

1.XA


XA是由X/Open組織提出的分散式交易的規範。XA規範主要定義了(全域)交易管理員(Transaction Manager)和(局部)資源管理員(Resource Manager)之間的介面。XA介面是雙向的系統介面,在交易管理員(Transaction Manager)以及一個或多個資源管理員(Resource Manager)之間形成通訊橋樑。XA之所以需要引入交易管理員是因為,在分布式系統中,從理論上講(參考Fischer等的論文),兩台機器理論上無法達到一致的狀態,需要引入一個單點進行協調。交易管理員控制著全域事務,管理事務生命週期,並協調資源。資源管理員負責控制和管理實際資源(如資料庫或JMS隊列)。說明了交易管理員、資源管理員,與應用程式之間的關係:


650) this.width=650;" src="http://my.csdn.net/uploads/201205/29/1338274936_5727.gif" style="line-height:26.25px;border:0px none;height:auto;" />

圖1.XA規範下的分散式交易各類參與者之間的關係


2.JTA


作為java平台上事務規範JTA(Java Transaction API)也定義了對XA事務的支援,實際上,JTA是基於XA架構上建模的,在JTA 中,交易管理員抽象為javax.transaction.TransactionManager介面,並通過底層事務服務(即JTS)實現。像很多其他的java規範一樣,JTA僅僅定義了介面,具體的實現則是由供應商(如J2EE廠商)負責提供,目前JTA的實現主要由以下幾種:


1.J2EE容器所提供的JTA實現(JBoss)
2.獨立的JTA實現:如JOTM,Atomikos.這些實現可以應用在那些不使用J2EE應用伺服器的環境裡用以提供分布事事務保證。如Tomcat,Jetty以及普通的java應用。


3.兩階段交易認可


所有關於分散式交易的介紹中都必然會講到兩階段交易認可,因為它是實現XA分散式交易的關鍵(確切地說:兩階段交易認可主要保證了分散式交易的原子性:即所有結點要麼全做要麼全不做)。所謂的兩個階段是指:第一階段:準備階段和第二階段:提交階段。


650) this.width=650;" src="http://my.csdn.net/uploads/201205/29/1338275146_7918.png" style="line-height:26.25px;border:0px none;height:auto;" />

圖2.兩階段交易認可(摘自info發布的《java事務設計策略》一文)



1.準備階段:事務協調者(交易管理員)給每個參與者(資源管理員)發送Prepare訊息,每個參與者要麼直接返回失敗(如許可權驗證失敗),要麼在本地執行事務,寫本地的redo和undo日誌,但不提交,到達一種“萬事俱備,只欠東風”的狀態。(關於每一個參與者在準備階段具體做了什麼目前我還沒有參考到確切的資料,但是有一點非常確定:參與者在準備階段完成了幾乎所有正式提交的動作,有的材料上說是進行了“試探性的提交”,只保留了最後一步耗時非常短暫的正式提交操作給第二階段執行。)

2.提交階段:如果協調者收到了參與者的失敗訊息或者逾時,直接給每個參與者發送復原(Rollback)訊息;否則,發送提交(Commit)訊息;參與者根據協調者的指令執行提交或者復原操作,釋放所有交易處理過程中使用的鎖資源。(注意:必須在最後階段釋放鎖資源)

將提交分成兩階段進行的目的很明確,就是儘可能晚地提交事務,讓事務在提交前儘可能地完成所有能完成的工作,這樣,最後的提交階段將是一個耗時極短的微小操作,這種操作在一個分布式系統中失敗的機率是非常小的,也就是所謂的“網路通訊危險期”非常的短暫,這是兩階段交易認可確保分散式交易原子性的關鍵所在。(唯一理論上兩階段交易認可出現問題的情況是當協調者發出提交指令後當機並出現磁碟故障等永久性錯誤,導致事務不可追蹤和恢複)

從兩階段交易認可的工作方式來看,很顯然,在提交事務的過程中需要在多個節點之間進行協調,而各節點對鎖資源的釋放必須等到事務最終提交時,這樣,比起一階段提交,兩階段交易認可在執行同樣的事務時會消耗更多時間。事務執行時間的延長意味著鎖資源發生衝突的機率增加,當事務的並發量達到一定數量的時候,就會出現大量事務積壓甚至出現死結,系統效能就會嚴重下滑。這就是使用XA事務

4.一階段提交(Best Efforts 1PC模式)

不像兩階段交易認可那樣複雜,一階段提交非常直白,就是從應用程式向資料庫發出提交請求到資料庫完成提交或復原之後將結果返回給應用程式的過程。一階段提交不需要“協調者”角色,各結點之間不存在協調操作,因此其事務執行時間比兩階段交易認可要短,但是提交的“危險期”是每一個事務的實際提交時間,相比於兩階段交易認可,一階段提交出現在“不一致”的機率就變大了。但是我們必須注意到:只有當基礎設施出現問題的時候(如網路中斷,當機等),一階段提交才可能會出現“不一致”的情況,相比它的效能優勢,很多團隊都會選擇這一方案。關於在spring環境下如何?一階段提交,有一篇非常優秀的文章值得參考

5.事務補償機制


像best efforts 1PC這種模式,前提是應用程式能擷取所有的資料來源,然後使用同一個交易管理員(這裡指是的spring的交易管理員)管理事務。這種模式最典型的應用情境非資料庫sharding莫屬。但是對於那些基於web service/rpc/jms等構建的高度自治(autonomy)的分布式系統介面,best efforts 1PC模式是無能為力的,此類情境下,還有最後一種方法可以協助我們實現“最終一致性”,那就是事務補償機制。關於事務補償機制是一個大話題,本文只簡單提及,以後會作專門的研究和介紹。


6.在基於兩階段交易認可的標準分散式交易和Best Efforts 1PC兩者之間如何選擇

一般而言,需要互動的子系統數量較少,並且整個系統在未來不會或很少引入新的子系統且負載長期保持穩定,即無伸縮要求的話,考慮到開發複雜度和工作量,可以選擇使用分散式交易。對於時間需求不是很緊,對效能要求很高的系統,應考慮使用Best Efforts 1PC或事務補償機制。對於那些需要進行sharding改造的系統,基本上不應再考慮分散式交易,因為sharding開啟了資料庫水平伸縮的視窗,使用分散式交易看起來好像是為新開啟的視窗又加上了一把枷鎖。

補充:關於網路通訊的危險期

由於網路通訊故障隨時可能發生,任何發出請求後等待回應的程式都會有失去聯絡的危險。這種危險發生在發出請求之後,伺服器返回應答之前,如果在這個期間網 絡通訊發生故障,發出請求一方無法收到回應,於是無法判斷伺服器是否已經成功地處理請求,因為收不到回應可能是請求沒有成功地發送到伺服器,也可能是服務 器處理完成後的回應無法傳回請求方。這段時間稱為網路通訊的危險期(In-doubt Time)。很顯然,網路通訊的危險期是分布式系統除單點可靠性之外需要考慮的另一個可靠性問題。

  • 核心技術:Maven,Springmvc mybatis shiro, Druid, Restful, Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx 
    1.     項目核心代碼結構

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img0.ph.126.net/Goz2TSj6v24kaqQDAIWgLw==/6598225353437986053.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

       項目模組依賴

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img1.ph.126.net/TC5PboH2UrIg4awkAMOyrw==/4851221223708896623.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

    特別提醒:開發人員在開發的時候可以將自己的業務REST服務化或者Dubbo服務化

    2.    項目依賴介紹

       2.1 後台管理系統、Rest服務系統、Scheculer定時調度系統依賴如:

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img0.ph.126.net/j2cCMu9-DPoHFYVkXI7EkA==/1632273390045933411.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

           2.2 Dubbo獨立服務項目依賴如:

     650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img1.ph.126.net/mzBW9KCk1Ji2GPUJaGu6Qg==/6598060426694000458.png" style="line-height:28px;border:0px;height:auto;margin:0px 10px 0px 0px;" />

    3.  項目功能部分:

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img1.ph.126.net/R2RTUQTg1qRIYtR4JE545A==/4940167316349343345.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img1.ph.126.net/Kh41psRstvnkqv_VpeFUAw==/6631327250448980134.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img2.ph.126.net/M9iZx7_jKbRN6QfH2TflPA==/4910612443794473834.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img1.ph.126.net/WnBR5XwOIAFFQTbo3P2I5w==/6631353638728044520.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img1.ph.126.net/CbSXpaSEViBxBVvYH_UzSw==/4937634041558914975.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img0.ph.126.net/JHKoVqcKwJoTf_UkHO0xpg==/6631285469007125325.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img1.ph.126.net/AGCXOstkj3CjJX8FL12t3w==/6631369031890838044.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

    zookeeper、dubbo服務啟動 

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img2.ph.126.net/aeb_ZacYQ2x3RkZmZRvXfg==/6631277772425730935.jpg" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img1.ph.126.net/8uGn2q8DYGHEfap7l5i7eg==/6598168178833342534.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

    dubbo管控台 

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img0.ph.126.net/OjhpzGvQ1A3wYhNG-3yiiQ==/4910612443794473838.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img0.ph.126.net/xDDLDlx-0BYku3c-PT1hSA==/6631377827983857282.jpg" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img2.ph.126.net/Pe2usGq905zYbeABB19BFA==/6598242945624026279.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img2.ph.126.net/Pe2usGq905zYbeABB19BFA==/6598242945624026279.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img0.ph.126.net/NZyKHiQnl9HMUG4vgAJCmA==/6598242945624026280.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img1.ph.126.net/zdqiMlYZE8enU9OOJI5hkg==/6598124198368231315.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img0.ph.126.net/iC0Apk3e_SfWpH5Sxzdoeg==/6631397619193157043.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     REST服務平台

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img2.ph.126.net/i_7g-c5Bu6iUwnen5c-oTA==/6631272274867597160.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img2.ph.126.net/RJW86mKqfpAQosKdxNDvrw==/6631262379262944404.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img2.ph.126.net/iKI6fMvQvEcLni70qSOhrg==/4834614200082603008.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     

    650) this.width=650;" alt="分布式架構介紹 - kafkaee - kafkaee的部落格" src="http://img0.ph.126.net/6IEo5vS4yRcjVZxYgVlpig==/6631351439704794060.png" style="border:0px;height:auto;margin:0px 10px 0px 0px;" />

     



關於分散式交易、兩階段交易認可、一階段提交、Best Efforts 1PC模式和事務補償機制的研究[轉]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.