酷Go推荐 分布式事务管理器 dtm

yedf · 2021年07月17日 · 445 次阅读
本帖已被设为精华帖!

推荐理由

落地微服务,必然会带了分布式事务的难题,此项目优雅的解决了该问题,是 golang 在分布式事务领域首个开源项目。支持多种语言,能够在多语言栈下渐进式迁移你的微服务。另外该项目提供了子事务屏障技术,极大的简化了业务接入。

功能介绍

  • 支持多种事务模式:TCC、SAGA、XA、事务消息
  • 跨语言支持,已支持 golang、python、nodejs
  • 提供子事务屏障功能,优雅解决幂等、悬挂、空补偿等问题,降低业务人员负担

与其他框架对比

目前开源的分布式事务框架,有阿里的 SEATA、华为的 ServiceComb-Pack,京东的 shardingsphere,以及 himly,tcc-transaction,ByteTCC 等等,其中以 seata 应用最为广泛。

这些框架基本都是 Java 语言,非 Java 语言的,暂未看到有成熟的框架。

下面将 dtm 和 seata 的主要特性做一下对比:

特性 DTM SEATA 备注
支持语言 Golang、python、node 及其他 Java dtm 可轻松接入一门新语言
异常处理 子事务屏障技术 手动处理 dtm 解决了幂等、悬挂、空补偿
TCC 事务
XA 事务
AT 事务 AT 事务与 XA 事务类似
SAGA 事务 简单模式 状态机复杂模式 dtm 的状态机模式在规划中
事务消息 dtm 提供类似 rocketmq 的事务消息
通信协议 HTTP dubbo 等协议,无 HTTP dtm 后续将支持 grpc 类协议
star 数量 github stars github stars dtm 从 20210604 发布 0.1,发展快

从上面对比的特性来看,如果您的语言栈包含了 Java 之外的语言,那么 dtm 是您的首选。如果您的语言栈是 Java,您也可以选择接入 dtm,使用子事务屏障技术,简化您的业务编写。

文档

dtm有大量技术文章,深入浅出的讲解分布式事务相关的技术要点:

分布式事务最经典的七种解决方案

用 Go 轻松完成一个分布式事务 TCC

分布式事务实战--go 语言的 saga 事务

分布式事务实战 -- 一个完整的 xa 例子

子事务屏障技术 -- 一个函数搞定事务乱序

使用指南

安装

git clone github.com/yedf/dtm

dtm 依赖于 mysql 配置 mysql:

cp conf.sample.yml conf.yml # 修改conf.yml

启动并运行 saga 示例

go run app/main.go saga

开始使用

// 具体业务微服务地址
const qsBusi = "http://localhost:8081/api/busi_saga"
  req := &gin.H{"amount": 30} // 微服务的载荷
  // DtmServer为DTM服务的地址,是一个url
  saga := dtmcli.NewSaga("http://localhost:8080/api/dtmsvr").
      // 添加一个TransOut的子事务,正向操作为url: qsBusi+"/TransOut", 补偿操作为url: qsBusi+"/TransOutCompensate"
      Add(qsBusi+"/TransOut", qsBusi+"/TransOutCompensate", req).
      // 添加一个TransIn的子事务,正向操作为url: qsBusi+"/TransOut", 补偿操作为url: qsBusi+"/TransInCompensate"
      Add(qsBusi+"/TransIn", qsBusi+"/TransInCompensate", req)
  // 提交saga事务,dtm会完成所有的子事务/回滚所有的子事务
err := saga.Submit()

该示例中,创建了一个 saga 事务,然后指定了该事务包含 TransOut 和 TransIn 两个子事务,子事务里面有正向操作和逆向操作的分支。

提交 saga 事务之后,dtm 会调用这两个子事务,一旦出错,会合理调用相应的补偿操作。

相关的调用,都可以看到相关的日志,整个过程的时序图如下:

总结

dtm作为分布式事务管理器,实现了多种分布式事务模式的支持以及多语言的支持,极大的简化了分布式事务的开发成本,是落地微服务的必备利器

参考资料

https://github.com/yedf/dtm

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
cloudy GoCN 每日新闻 (2021-07-17) 中提及了此贴 07月17日 15:35
astaxie 将本帖设为了精华贴 07月20日 03:25
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册