English | 简体中文
分布式事务管理器
什么是 DTM
DTM 是一个分布式事务框架,提供跨服务的最终数据一致性。它支持 saga、tcc、xa、2 阶段消息、outbox、工作流等模式,适用于各种应用场景。它还支持多种语言和多种存储引擎来组成事务,如下图所示:
谁在使用 DTM(部分)
特性
- 支持多种事务模式:SAGA、TCC、XA、工作流、Outbox
- 多语言支持:提供 Go、Java、PHP、C#、Python、Node.js 的 SDK
- 更好的 Outbox:2 阶段消息,比 Outbox 更优雅的解决方案,支持多数据库
- 支持多种数据库事务:MySQL、Redis、MongoDB、PostgreSQL、TDSQL 等
- 支持多种存储引擎:MySQL(通用)、Redis(高性能)、BoltDB(开发测试)、MongoDB(计划中)
- 支持多种微服务架构:go-zero、go-kratos/kratos、polarismesh/polaris
- 支持高可用和易于水平扩展
应用场景
DTM 可以应用于大量场景中的数据一致性问题,以下是几个常见的场景:
- 缓存管理:彻底保证缓存的最终一致性和强一致性
- 秒杀扣库存:即使在极端情况下,也能确保 Redis 中的精确库存与最终创建的订单完全一致,无需手动调整
- 非单体订单系统:大幅简化架构
- 事件发布/订阅:更好的 outbox 模式
使用指南
快速开始
运行 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 {
// ...
// 为 TransOut 定义一个事务分支
wf.NewBranch().OnRollback(func(bb *dtmcli.BranchBarrier) error {
// TransOut 的补偿操作
_, err := busiCli.TransOutRevert(wf.Context, &req)
return err
})
_, err = busiCli.TransOut(wf.Context, &req)
// 检查错误
// 为 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)
// 执行工作流
_, err = workflow.ExecuteCtx(wfName, shortuuid.New(), data)
logger.Infof("工作流执行结果:%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 获取更多示例。
给个星星!⭐
如果你认为这个项目有趣,或者对你有帮助,请给个星星!