分布式交易管理器的详细指南

237 阅读2分钟

分布式交易管理器

什么是DTM

DTM是一个分布式事务框架,它提供跨服务的最终数据一致性。它为各种应用场景提供saga, tcc, xa, 2-phase message, outbox模式。它还支持多语言和多存储引擎,以形成以下交易。

function-picture

特点

快速启动

运行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/dtmcli-go-sample && cd dtmcli-go-sample
go run main.go

代码

使用

   // business micro-service address
  const qsBusi = "http://localhost:8081/api/busi_saga"
  // The address where DtmServer serves DTM, which is a url
  DtmServer := "http://localhost:36789/api/dtmsvr"
  req := &gin.H{"amount": 30} // micro-service payload
	// DtmServer is the address of DTM micro-service
	saga := dtmcli.NewSaga(DtmServer, shortuuid.New()).
		// add a TransOut sub-transaction,forward operation with url: qsBusi+"/TransOut", reverse compensation operation with url: qsBusi+"/TransOutCom"
		Add(qsBusi+"/TransOut", qsBusi+"/TransOutCom", req).
		// add a TransIn sub-transaction, forward operation with url: qsBusi+"/TransIn", reverse compensation operation with url: qsBusi+"/TransInCom"
		Add(qsBusi+"/TransIn", qsBusi+"/TransInCom", req)
	// submit the created saga transaction,dtm ensures all sub-transactions either complete or get revoked
	err := saga.Submit() 

当上述代码运行时,我们可以在控制台中看到TransOut、TransIn服务已经被调用。

时序图

一个成功完成的SAGA事务的时序图如下:

saga-success

失败时回滚

如果任何前向操作失败,DTM会调用每个子事务的相应补偿操作来回滚,之后事务会成功回滚。

让我们故意让第二个子事务的前向操作失败,看看会发生什么

app.POST(qsBusiAPI+"/TransIn", func(c *gin.Context) {
  log.Printf("TransIn")
  // c.JSON(200, "")
  c.JSON(409, "") // Status 409 for Failure. Won't be retried
})

预期失败的时序图如下:

saga-failed

更多的例子

上面的例子主要演示了一个分布式事务的流程。更多的内容,包括如何与实际的数据库对接,如何做补偿,如何做回滚等实际的例子,请参考dtm-examples