1. 程式人生 > >【分布式事務】微服務架構下的分布式事務問題

【分布式事務】微服務架構下的分布式事務問題

queue spring 回滾 事務提交 relative 社區 confirm 模型 功能

一、基本概念

  1. ACID理論:關系型數據庫的事務滿足 ACID 的特性,具有 ACID 特性的數據庫支持數據的強一致性,保證了數據本身不會出現不一致。適用於傳統的單體架構。
  2. CAP理論:在分布式系統下, 包含三個要素:Consistency(一致性)、Availability(可用性)、Partition tolerance(分區容錯性),並且三者不可兼得。分布式系統要求保證分區容錯性,只能在數據強一致性(C)和可用性(A)之間做平衡,即選擇CP或者AP。比如Zookeeper為CP系統保證強一致性犧牲一定的可用性;Eureka為AP系統保證較高可用性犧牲一定的一致性。另外,CAP理論中是忽略網絡延遲,也就是當事務提交時,從節點A復制到節點B,但是在現實中這個是明顯不可能的,所以總會有一定的時間是不一致。所以CAP一般適用於局域網系統的理論基礎。
  3. BASE理論:解決 CAP 理論中分布式系統的可用性和一致性不可兼得的問題,提出最終一致性。即,最終數據是一致的就可以了,而不是實時保持強一致。例如,支付成功,訂單也成功,但增加積分失敗,此時,不應回滾支付和訂單,而應通過一些 補償方法來讓積分得以正確地增加。

二、解決方案

方案解決思路適用場景說明
本地事務
  1. 基於數據庫的ACID理論
  2. 基於undo、redo日誌記錄
  3. undo日誌實現回滾、redo日誌實現commit場景異常的恢復
  1. 傳統單體架構
  2. 分布式事務要求不高的場景
  1. 分布式系統場景出現問題怎麽辦?
  2. 日誌記錄--監控告警–人工幹預修復
  3. 問題溯源,例如:維修工單可以創建,但是維修費用調用失敗導致整個事務回滾
    1. 可能維修費用自身問題,如性能壓力過大導致請求時,觸發調用失敗回滾
    2. 可能維修費用操作依據成功了,但是返回
兩階段提交
  1. 基於XA協議,依賴TM、RM的交互,依賴數據庫的能力
  2. TM存在單點故障,鎖資源占用時間較長
  1. 面向多數據源或者分布式數據庫設計(XA本質是TM與RM之間的規範)
  2. 適用於多數據源的架構
  3. Mycat也實現了XA協議,一些公司的分布式事務使用該方案,但是應用層非微服務架構
  4. 適用於並發量不大,處理時間較短的核心交易業務場景
  1. XA協議:
    技術分享圖片
三階段提交
  1. 基於TCC協議
  2. 在數據庫外部實現事務機制達到最終一致性
  3. 犧牲了應用的靈活性,需要提供Try、Confirm、Cancel的具體實現,且需要小心保證冪等操作
  1. 跨應用,但需要實現TCC接口,對已有系統侵入較大,適用於新系統
  2. 不強依賴數據庫特性,TCC是一個通用的模型
  3. 參考實現:https://github.com/liuyangming/ByteTCC/
  1. TCC協議:
    技術分享圖片
可靠消息模式
  1. 大事務轉變為小事務,小事物之間的不一致通過額外的輪訓任務進行補償
  2. 該思路最初由Ebay提出:https://queue.acm.org/detail.cfm?id=1394128
  3. 可分為基於本地事件、基於外部事件兩種模式
  4. 業務邏輯需要保證冪等性
  1. 適用於核心模塊的改造,或者完全基於消息驅動的架構,否則對已有系統入侵較大
  2. 另外,如果需要回滾,超過兩個實務操作的場景比較復雜,所以這種場景需要遵守最終一致性原則,失敗不會滾,直到補償成功
  3. 依賴具備事務功能的消息系統或者數據庫,如:RabbitMQ、Kafka、RocketMQ等

  1. 基於本地事件:技術分享圖片
  2. 基於外部事件:技術分享圖片

可靠消息變種
  1. 不依賴消息隊列通信,將消息隊列的功能包裝為Rest服務,屏蔽消息隊列的接口
  2. 將基於可靠消息模式對架構和應用入侵的缺點降低
  1. 最大努力通知型
  2. 如支付寶的回調機制,可以設置指數時間重試,參考阿裏實現:https://zhuanlan.zhihu.com/p/26114119
  1. 下遊應用輪詢
  2. 如微信的輪詢機制,由下遊應用自己保證一致性
SAGA方案
  1. 基於工作流的思路,原理:https://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf
  2. 定義順序操作、回滾操作的流程,交給事務協調器統一管理
  3. 一些應用框架實現了該方案,如CQRS框架Axonframework:https://github.com/AxonFramework/AxonFramework,又如華為servicecomb:https://github.com/apache/incubator-servicecomb-saga
  1. 應用方定義工作流,交給SAGA進行管理,雖然這種方案不火熱,但是對應用入侵較小,且符合分層的設計原則,添加一個composite層單獨實現需要分布式事務的流程即可

  1. SAGA工作流:
    技術分享圖片

阿裏GTS
  1. 優化XA架構的路線,使用上與XA類似,業務入侵較小,添加註解
  2. GTS參考:https://zhuanlan.zhihu.com/p/32684212
  3. 仿GTS實現:https://github.com/wxbty/meepo
    https://github.com/chenjy16/gts
  4. 與GTS類似的:https://github.com/codingapi/tx-lcn 看起來最成熟的開源方案
  1. 適用於阿裏雲方案,專線也可以接入使用,第三方系統遵循TCC的也可以接入
總結建議
  1. 如果非必要,不引入分布式事務,每個微服務保證自身的高可用,基本能夠保證數據的一致性,極端的情況除外。--事實上微服務的架構BAT十年前就在使用,沒有分布式事務也一樣,因為基礎設施、每個微服務自身可用性比較高,所以不需要引入更大的復雜性
  2. 如果必要,首先保證核心業務的數據一致性,比如交易業務,可以采用消息機制、最大努力通知、輪詢機制的方案,他們的本質都是記賬,即使出了問題也有據可查--這部分一般借助第三方支付系統的能力即可滿足
  3. 如果只是較少量的業務需要分布式事務特性,可以局部使用基於可靠消息的方案,參考:https://github.com/vvsuperman/coolmq,這種方案需要註意很多細節,理論上每個環節都可能出現網絡異常,都需要有相應的措施保障,比如:如果建立指數時間重試機制,下遊服務接口需要保證冪等,該方案相當於業務自己負責維護一致性
  4. 如果大量業務需要分布式事務,也可以引入類似DelayMq的服務做解耦,利用該服務提供回調服務將服務鏈串聯起來(消息中包含回調的Url、參數),但是下遊的服務接口需要保證冪等性--PaaS平臺可以提供類似的服務,參考:https://zhuanlan.zhihu.com/p/26114119。該方案需要能夠接受部分代碼的重構
  5. 如果大量業務需要分布式事務,可以引入類似GTS對業務入侵較小的框架,避免更新架構和代碼,代碼添加必要的註解即可,如:https://github.com/codingapi/tx-lcn --開源方案,建議經過測試之後謹慎上線,這個能力也可以研究下看看能不能做到PaaS平臺
  6. 數據一致性是一個系統工程,僅僅在事務框架層面解決是不夠的,還需要配套的規範措施--如請求RequestID、鏈路追蹤、接口冪等、日誌輸出規範、關鍵日誌記錄規範等,出現問題可以快速定位,這部分的數據可以讓PaaS接管,提供鏈路服務、監控告警服務等
  7. 完善基礎設施,降低網絡問題的影響是重要前提。對於實際調用已經成功,返回時網絡異常的問題,需要補償機制--PaaS可以提供類似DelayMq的服務
  8. 完善應用的監控告警設施,如應用的API、訪問次數、失敗次數等監控,及時告警--PaaS可以提供應用的實時監控告警能力

三、參考資料

  • 再有人問你分布式事務,把這篇扔給他:https://mp.weixin.qq.com/s/W7XeNKIwB-JxnyStq0xD6g

  • GTSDemo介紹:https://help.aliyun.com/document_detail/57267.html?spm=a2c4g.11174283.3.5.6eea735d9NoIS6

  • ByteTCC:https://github.com/liuyangming/ByteTCC/

  • GTS解密--GTS的原理、架構與特點:https://zhuanlan.zhihu.com/p/32684212

  • 分布式事務系列:https://blog.csdn.net/qq_27384769/article/details/79305402

四、GitHub相關項目

    • https://github.com/HasonHuang/distributed-transaction-process
    • https://github.com/QNJR-GROUP/EasyTransaction
    • https://github.com/vvsuperman/coolmq
    • https://github.com/yu199195/myth
    • https://github.com/yu199195/hmily
    • https://github.com/1991wangliang/tx-lcn
    • https://github.com/codingapi/tx-lcn
    • https://github.com/prontera/spring-cloud-rest-tcc
    • https://github.com/QNJR-GROUP/EasyTransaction

【分布式事務】微服務架構下的分布式事務問題