dtm
v1.18.0
英語 | 簡體中文
DTM是一個分散式交易框架,提供跨服務最終資料一致性。它提供了saga、tcc、xa、2-phase message、outbox、workflow模式,適合多種應用場景。它還支援多種語言和多種儲存引擎來形成交易,如下所示:
騰訊
位元組跳動
艾維達德
更多的
DTM可以應用於大量場景下的資料一致性問題,以下介紹幾個常見的
git clone https://github.com/dtm-labs/dtm && cd dtm
go run main.go
假設我們要進行銀行間轉帳。轉出(TransOut)和轉入(TransIn)操作分別編碼在單獨的微服務中。
下面透過一個例子來說明dtm對這個問題的解決方案:
git clone https://github.com/dtm-labs/quick-start-sample.git && cd quick-start-sample/workflow-grpc
go run main.go
wfName := "workflow-grpc"
err = workflow . Register ( wfName , func ( wf * workflow. Workflow , data [] byte ) error {
// ...
// Define a transaction branch for TransOut
wf . NewBranch (). OnRollback ( func ( bb * dtmcli. BranchBarrier ) error {
// compensation for TransOut
_ , err := busiCli . TransOutRevert ( wf . Context , & req )
return err
})
_ , err = busiCli . TransOut ( wf . Context , & req )
// check error
// Define another transaction branch for TransIn
wf . NewBranch (). OnRollback ( func ( bb * dtmcli. BranchBarrier ) error {
_ , err := busiCli . TransInRevert ( wf . Context , & req )
return err
})
_ , err = busiCli . TransIn ( wf . Context , & req )
return err
}
// ...
req := busi . BusiReq { Amount : 30 , TransInResult : "" }
data , err := proto. Marshal ( & req )
// Execute workflow
_ , err = workflow . ExecuteCtx ( wfName , shortuuid . New (), data )
logger . Infof ( "result of workflow.Execute is: %v" , err )
當上面的程式碼在運作時,我們可以在控制台看到服務TransOut
、 TransIn
已經被呼叫。
如果任何轉送操作失敗,DTM會呼叫每個子事務對應的補償操作進行回滾,之後事務成功回滾。
讓我們故意觸發第二個子事務的失敗,看看會發生什麼
// req := busi.BusiReq{Amount: 30, TransInResult: ""}
req := busi. BusiReq { Amount : 30 , TransInResult : "FAILURE" }
})
我們可以在控制台中看到TransOut
、 TransIn
、 TransOutRevert
服務已被調用
如果您需要更多快速入門範例,請參閱 dtm-labs/quick-start-sample
上面的例子主要示範了分散式事務的流程。更多內容,包括如何與實際資料庫互動、如何進行補償、如何進行回滾等實際範例,請參閱 dtm-examples 以了解更多範例。
如果您覺得這個專案有趣,或對您有幫助,請給個star!