分布式事務之 Seata

2022-02-06 04:47:56 字數 3631 閱讀 9054

官網 :

seata 是一款開源的分布式事務解決方案,致力於在微服務架構下提供高效能和簡單易用的分布式事務服務。在 seata 開源之前,seata 對應的內部版本在阿里經濟體內部一直扮演著分布式一致性中介軟體的角色,幫助經濟體平穩的度過歷年的雙11,對各bu業務進行了有力的支撐。經過多年沉澱與積累,商業化產品先後在阿里雲、金融雲進行售賣。2019.1 為了打造更加完善的技術生態和普惠技術成果,seata 正式宣布對外開源,未來 seata 將以社群共建的形式幫助其技術更加可靠與完備。

其實 seata 之所以能保證分布式事務的一致性,我的理解是seata鎖扮演的角色跟zookeeper是類似的。在服務進行拆分後進行多服務節點的部署,這使得多個節點的事務操作失去了聯絡,而seata 作為事務協調者,扮演著乙個上帝視角。對於託管了事務操作的服務來說,seata是完全可見的。事務是否提交/回滾。均要受到seata的控制。也正是如此。seata 可以控制分布式事務。seata 提供了 at、tcc、saga 和 xa 事務模式,為使用者打造一站式的分布式解決方案。

seata at 模式

前提整體機制

兩階段提交協議的演變:

seata tcc 模式

根據兩階段行為模式的不同,我們將分支事務劃分為 automatic (branch) transaction mode 和 tcc (branch) transaction mode.

at 模式(參考鏈結 tbd)基於 支援本地 acid 事務 的 關係型資料庫:

相應的,tcc 模式,不依賴於底層資料資源的事務支援:

所謂 tcc 模式,是指支援把 自定義 的分支事務納入到全域性事務的管理中。

seata saga 模式

適用場景:

優勢:缺點:

saga的實現:

基於狀態機引擎的 saga 實現:

目前seata提供的saga模式是基於狀態機引擎來實現的,機制是:

通過狀態圖來定義服務呼叫的流程並生成 json 狀態語言定義檔案

狀態圖中乙個節點可以是呼叫乙個服務,節點可以配置它的補償節點

狀態圖 json 由狀態機引擎驅動執行,當出現異常時狀態引擎反向執行已成功節點對應的補償節點將事務回滾

可以實現服務編排需求,支援單項選擇、併發、子流程、引數轉換、引數對映、服務執行狀態判斷、異常捕獲等功能

seata xa 模式

從程式設計模型上,xa 模式與 at 模式保持完全一致。

可以參考 seata 官網的樣例:seata-xa

樣例場景是 seata 經典的,涉及庫存、訂單、賬戶 3 個微服務的商品訂購業務。

在樣例中,上層程式設計模型與 at 模式完全相同。只需要修改資料來源**,即可實現 xa 模式與 at 模式之間的切換。

seata-server包含兩個核心配置檔案,其中registry.conf表示配置seata服務註冊的位址,它目前支援所有主流的註冊中心(nacos 、eureka、redis、zk、consul、etcd3、sofa)。預設是file,表示不依賴於註冊中心以及配置中心。

file.conf儲存的是seata服務端的配置資訊,完整的配置包含transport、server、metrics,分別表示通訊配置,服務端配置,監控等。

配置資訊修改參考 :

然後保持預設配置啟動服務即可 sh seata-server.sh  ,後台啟動 nohup ./seata-server.sh >log.out 2>1 &

官方提供了常見的各種整合方式,github位址 :

將工程 clone 下來,其中有個 springboot-dubbo-seata 工程,基於 at 模式。涉及元件 springboot + dubbo + mybatis + nacos + seata 。按照演示步驟操作

整合 seata 中比較重要的操作:

1.依賴 

io.seata

seata-all

1.3.0

2.配置事務掃瞄器

@bean

publicglobaltransactionscanner globaltransactionscanner()

關於事務分組的概念參考:

3.配置檔案file.conf

transport 

shutdown

serialization = "seata"compressor = "none"}

service

client

reportretrycount = 5tablemetacheckenable = falsereportsuccessenable = false}

tm undo

log

}

registry.conf

registry 

eureka

redis

zk consul

etcd3

sofa

file

}config

consul

apollo

etcd3

file

}

然後在 samples-business 模組的 io.seata.samples.integration.call.service 包下有個 businessserviceimpl 測試服務:

@service

public classbusinessserviceimpl implements businessservice

if (storageresponse.getstatus() != 200 || response.getstatus() != 200)

objectresponse.setstatus(rspstatusenum.success.getcode());

objectresponse.setmessage(rspstatusenum.success.getmessage());

objectresponse.setdata(response.getdata());

returnobjectresponse;}}

可以看到最核心的還是註解  @globaltransactional。 可以通過其中的異常測試事務的回滾,當我們在這行**打上斷點的時候,再去看資料庫的 undo_log 表,會插入三條回滾日誌,用於回滾操作

其中 rollback_info 內容大致如下:

, ]]

}]]},

"afterimage": , ]]

}]]}

}]]}

大概就是資料的操作前後映象,然後根據這個做回滾操作。

seata分布式事務

分布式事務使用,組長有話說 1 跨服務呼叫的 兩邊都有改資料或新增資料的 都要加上本地事物 並且 發起方要加上 分布式事物 千萬別忘了啊 2 尤其是 呼叫mq的時候 3 我把用到mq的地方都加了分布式註解,漏的你們看一下。portal的託運單,確認下單後,先同步到oms,再從oms同步到tms 1....

seata 分布式事務

seata 是乙個分布式事務解決方案,內建了對at xa tcc saga的支援,主要由tc tm rm三類角色,tc 事務協調器 作為服務端,tm 事務管理器 和rm 資源管理器 工作在客戶端。seata最大程度的保證了對應用的透明。at模式 at模式是通過乙個兩階段提交的方式來管理事務,第一階段...

分布式事務seata學習

1 at模式 2 tcc模式 3 saga模式 at 模式基於 支援本地 acid 事務 的 關係型資料庫 一階段 prepare 行為 在本地事務中,一併提交業務資料更新和相應回滾日誌記錄。二階段 commit 行為 馬上成功結束,自動 非同步批量清理回滾日誌。二階段 rollback 行為 通過...