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!