DTM:分布式事务管理的利器

DTM:分布式事务管理的利器

dtf大家好,dtm最终跟原公司谈下来了知识产权转让,现已恢复维护,请大家访问 https://github.com/dtm-labs/dtm 。中间给大家带来的不便,敬请谅解!项目地址:https://gitcode.com/gh_mirrors/dt/dtf

项目介绍

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 事务的时序图如下:

saga-success

失败回滚

如果任何正向操作失败,DTM 会调用相应的补偿操作来回滚事务,确保事务成功回滚。

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

app.POST(qsBusiAPI+"/TransIn", func(c *gin.Context) {
  log.Printf("TransIn")
  // c.JSON(200, "")
  c.JSON(409, "") // 状态 409 表示失败,不会重试
})

失败的时序图如下:

saga-failed

更多示例

更多示例请参考 dtm-examples

加入 Slack 社区

您可以加入 DTM Slack 频道 与其他开发者交流。

给个星星吧!⭐

如果您觉得这个项目不错,或者对您有帮助,请给它一个星星!

dtf大家好,dtm最终跟原公司谈下来了知识产权转让,现已恢复维护,请大家访问 https://github.com/dtm-labs/dtm 。中间给大家带来的不便,敬请谅解!项目地址:https://gitcode.com/gh_mirrors/dt/dtf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郎赞柱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值