當前位置:
首頁 > 最新 > 分散式事務解決方案

分散式事務解決方案

Spring Cloud 分散式事務管理

在微服務如火如荼的情況下,越來越多的項目開始嘗試改造成微服務架構,微服務即帶來了項目開發的方便性,又提高了運維難度以及網路不可靠的概率.

[TOC]

在說微服務的優缺點時,有對比才會更加明顯,首先說一下單體式結構


單體式架構

在單體式架構中,系統通常採用分層架構模式(MVC),持久化層、表示層,業務邏輯層。架構主要存在以下問題:

系統內部互相訪問,耦合緊密導致難以維護;

各業務領域需要採用相同的技術棧,難以快速應用新技術(例如使用SSH很難向SSM改造);

對系統的任何修改都必須整個系統一起重新部署/升級;

在系統負載增加時,難以進行水平擴展;

當系統中一處出現問題,會影響整個系統;

為了克服以上缺點,微服務架構應運而生。微服務,又叫微服務架構。微服務就是一些協同工作的小而自治的服務.


微服務架構

1. 技術異構性

在不同的服務中,可以使用不同的技術來各自開發,只要保證服務間能相互協作即可

2. 彈性

當微服務中的某一個服務不可用時,不會影響整個系統,只會影響相關功能不可用

3. 擴展

易於擴展,使用小的多個服務,更加易於擴展新的功能

4. 簡化部署

某個服務的更新部署,不需要重新部署整個應用

5. 可組合

通過組合多個服務,可以提供一些新的功能

6. 可替代

因為每個微服務都比較小,重新實現某一個服務或者直接刪除該服務都是可操作的


1. 複雜度高

微服務間通過REST、RPC等形式交互,相對於單體模式,需要考慮被調用方故障、過載、消息丟失等各種異常情況,代碼邏輯更加複雜。

對於微服務間的事務性操作,因為不同的微服務採用了不同的資料庫,將無法利用資料庫本身的事務機制保證一致性,需要引入二階段提交等技術。

同時,在微服務間存在少部分共用功能但又無法提取成微服務時,各個微服務對於這部分功能通常需要重複開發,或至少要做代碼複製,以避免微服務間的耦合,增加了開發成本。

2. 運維複雜

在採用微服務架構時,系統由多個獨立運行的微服務構成,需要一個設計良好的監控系統對各個微服務的運行狀態進行監控。運維人員需要對系統有細緻的了解才對夠更好的運維繫統。

3. 影響性能

相對於單體架構,微服務的間通過REST、RPC等形式進行交互,通信的時延會受到較大的影響。


分散式事務的引入

正如上面所說

對於微服務間的事務性操作,因為不同的微服務採用了不同的資料庫,將無法利用資料庫本身的事務機制保證一致性,需要引入二階段提交等技術。

在單體項目中,很容易做到事務控制,而在多個服務之間很難實現

假設服務調用如下:A B C D 的事務均在各個服務控制,如何做到,統一協調,保證數據的一致性?


分散式事務解決方案

XA是一個分散式事務協議,由提出。XA中大致分為兩部分:事務管理器和本地資源管理器。其中本地資源管理器往往由資料庫實現,比如Oracle、DB2這些商業資料庫都實現了XA介面,而事務管理器作為全局的調度者,負責各個本地資源的提交和回滾。XA實現分散式事務的原理如下:第一階段:

第二階段

總的來說,XA協議比較簡單,而且一旦商業資料庫實現了XA協議,使用分散式事務的成本也比較低。但是,XA也有致命的缺點,那就是性能不理想,特別是在交易下單鏈路,往往並發量很高,XA無法滿足高並發場景。XA目前在商業資料庫支持的比較理想,在mysql資料庫中支持的不太理想,mysql的XA實現,沒有記錄prepare階段日誌,主備切換回導致主庫與備庫數據不一致。許多nosql也沒有支持XA,這讓XA的應用場景變得非常狹隘。


所謂的消息事務就是基於消息中間件的兩階段提交,本質上是對消息中間件的一種特殊利用,它是將本地事務和發消息放在了一個分散式事務里,保證要麼本地操作成功成功並且對外發消息成功,要麼兩者都失敗,開源的RocketMQ就支持這一特性.

該方案採用最終一致的,犧牲了一致性,換來了性能的大幅度提升。存在造成數據不一致的風險


所謂的TCC編程模式,也是兩階段提交的一個變種。TCC提供了一個編程框架,將整個業務邏輯分為三塊:Try、Confirm和Cancel三個操作。以在線下單為例,Try階段會去扣庫存,Confirm階段則是去更新訂單狀態,如果更新訂單失敗,則進入Cancel階段,會去恢復庫存。總之,TCC就是通過代碼人為實現了兩階段提交,不同的業務場景所寫的代碼都不一樣,複雜度也不一樣,因此,這種模式並不能很好地被複用。


具體實現

https://github.com/codingapi/tx-lcn

目前 LCN為 4.1 版本

主要特點:

支持各種基於spring的db框架

兼容SpringCloud、Dubbo、motan

使用簡單,低依賴,代碼完全開源

基於切面的強一致性事務框架

高可用,模塊可以依賴RPC模塊做集群化,TxManager也可以做集群化

支持本地事務和分散式事務共存

支持事務補償機制,增加事務補償決策提醒

採用強一致性方案,事務要不全部成功,要不全部失敗,保證了事務的一致性,代碼簡單,原有項目只需引入相關 包,並在需要參與的事務的方法添加註解即可,節省了代碼改造成本.

Spring Cloud示例:

添加依賴

在需要執行的事務上添加註解

其中 為lcn事務控制註解,其中 表示該方法是事務的發起方例如,服務A 需要調用服務B,服務B 需要調用服務C,此時 服務A為服務發起方,其餘為參與方,參與方只需 即可

在測試時需要將 事務管理服務啟動 , 具體示例參看:https://www.txlcn.org


https://github.com/liuyangming/ByteTCC

ByteTCC是一個基於TCC(Try/Confirm/Cancel)機制的分散式事務管理器。兼容JTA,可以很好的與EJB、Spring等容器(本文檔下文說明中將以Spring容器為例)進行集成。

ByteTCC特性1、支持Spring容器的聲明式事務管理;2、支持普通事務、TCC事務、業務補償型事務等事務機制;3、支持多數據源、跨應用、跨伺服器等分散式事務場景;4、支持長事務;5、支持dubbo服務框架;6、支持spring cloud;

該實現方式,需要在業務層編寫對應的 tcc(Try/Confirm/Cancel) 方法,開發需要一定的成本,同時某些業務可能無法保證數據可回滾

查看示例:https://github.com/liuyangming/ByteTCC

參考:

https://github.com/codingapi/tx-lcn

https://github.com/liuyangming/ByteTCC

微服務設計(Sam Newman)

如果你喜歡就關注一下吧. 以後會寫一下我們公司在使用Spring Cloud 中遇到的問題和一些經驗

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全棧佈道士 的精彩文章:

TAG:全棧佈道士 |