DTM:分布式事务管理的利器
项目介绍
DTM(Distributed Transactions Manager)是一个开源的分布式事务管理框架,旨在解决跨服务的数据最终一致性问题。DTM 提供了多种分布式事务解决方案,包括 Saga、TCC、XA 和两阶段消息,适用于多种应用场景。无论您使用的是 Go、Python、PHP、Node.js、Ruby 还是其他语言,DTM 都能轻松集成,帮助您构建可靠的分布式系统。
项目技术分析
DTM 的核心技术包括:
- 多语言支持:DTM 是一个语言无关的框架,适用于多语言栈的公司。它提供了多种语言的绑定,方便开发者集成。
- 多种分布式事务解决方案:DTM 支持 Saga、TCC、XA 和两阶段消息等多种事务模式,满足不同场景的需求。
- 易用性:DTM 提供了简单易用的编程接口,支持 HTTP 和 gRPC 协议,大大降低了分布式事务的入门门槛。
- 自动处理复杂问题:DTM 框架层自动处理悬挂、空补偿、幂等事务等复杂问题,开发者无需担心这些细节。
- 易于部署和扩展:DTM 仅依赖 MySQL 或 Redis,部署简单,支持集群和水平扩展。
项目及技术应用场景
DTM 适用于以下场景:
- 微服务架构:在微服务架构中,服务之间的数据一致性是一个常见问题。DTM 可以帮助您轻松实现跨服务的最终一致性。
- 金融交易系统:在金融交易系统中,数据的一致性和可靠性至关重要。DTM 提供了多种事务模式,确保交易的安全和可靠。
- 电商系统:在电商系统中,订单、支付、库存等多个服务需要协同工作。DTM 可以帮助您确保这些服务之间的数据一致性。
项目特点
DTM 具有以下显著特点:
- 多语言支持:无论您使用的是哪种编程语言,DTM 都能轻松集成。
- 多种事务模式:DTM 提供了 Saga、TCC、XA 和两阶段消息等多种事务模式,满足不同场景的需求。
- 易用性:DTM 提供了简单易用的编程接口,支持 HTTP 和 gRPC 协议,大大降低了分布式事务的入门门槛。
- 自动处理复杂问题:DTM 框架层自动处理悬挂、空补偿、幂等事务等复杂问题,开发者无需担心这些细节。
- 易于部署和扩展:DTM 仅依赖 MySQL 或 Redis,部署简单,支持集群和水平扩展。
快速开始
运行 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
代码示例
使用 DTM
// 业务微服务地址
const qsBusi = "http://localhost:8081/api/busi_saga"
// DTM 服务的地址
DtmServer := "http://localhost:36789/api/dtmsvr"
req := &gin.H{"amount": 30} // 微服务负载
// 创建 Saga 事务
saga := dtmcli.NewSaga(DtmServer, dtmcli.MustGenGid(DtmServer)).
// 添加 TransOut 操作,正向操作为 qsBusi+"/TransOut",反向补偿操作为 qsBusi+"/TransOutCom"
Add(qsBusi+"/TransOut", qsBusi+"/TransOutCom", req).
// 添加 TransIn 操作,正向操作为 qsBusi+"/TransIn",反向补偿操作为 qsBusi+"/TransInCom"
Add(qsBusi+"/TransIn", qsBusi+"/TransInCom", req)
// 提交 Saga 事务,DTM 确保所有操作要么全部完成,要么全部回滚
err := saga.Submit()
运行上述代码后,您可以在控制台中看到 TransOut 和 TransIn 服务已被调用。
时序图
一个成功完成的 Saga 事务的时序图如下:
失败回滚
如果任何正向操作失败,DTM 会调用相应的补偿操作来回滚事务,确保事务成功回滚。
让我们故意使第二个子事务的正向操作失败,看看会发生什么:
app.POST(qsBusiAPI+"/TransIn", func(c *gin.Context) {
log.Printf("TransIn")
// c.JSON(200, "")
c.JSON(409, "") // 状态 409 表示失败,不会重试
})
失败的时序图如下:
更多示例
更多示例请参考 dtm-examples。
加入 Slack 社区
您可以加入 DTM Slack 频道 与其他开发者交流。
给个星星吧!⭐
如果您觉得这个项目不错,或者对您有帮助,请给它一个星星!