带你用go轻松完成一个saga分布式事务

yedf · · 1630 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

我们团队在引入go语言做微服务的过程中,遇见了分布式事务的强需求。我们的交易中心涉及大量的业务,包括了商品、库存、各类营销活动、商品权限等等,按照我们微服务的设计,需要拆分到多个微服务。原先由本地事务保证的ACID,现在需要分布式事务方案来保证交易的正确性。 我们调研了大量开源项目,发现只有java提供了分布式事务的中间件,其他语言,暂未发现成熟的方案。这种背景下,我们内部开发了针对go语言分布式事务的DTM项目,线上稳定之后,我们将它开源出来,github地址为:[yedf/dtm](https://github.com/yedf/dtm) 。 虽然DTM最初针对我们的go语言微服务,但是我们的设计方案,充分考虑了跨语言特性,将底层通信设计成HTTP(未来会支持grpc),并且将客户端做的非常轻,代码量非常少。 下面我们来看一个Go语言接入DTM的简单例子: ``` const DtmServer = "http://localhost:8080/api/dtmsvr" const startBusi = "http://localhost:8081/api/busi_saga" req := &gin.H{"amount": 30} // 微服务的负荷 // 生成dtm的saga对象 saga := dtm.SagaNew(DtmServer). // 添加两个子事务 Add(startBusi+"/TransOut", startBusi+"/TransOutCompensate", req). Add(startBusi+"/TransIn", startBusi+"/TransInCompensate", req) // 提交saga事务 err := saga.Commit() ``` 上述提交到dtm的saga事务,包括了两个子事务,TransOut和TransIn,以及两个子事务对应的补偿事务。事务提交到DTM后,DTM保证TransOut TransIn要么全部执行成功,要么任何一个子事务失败,会将执行过的子事务,再执行相应的补偿事务。 如果TransOut、TransIn都执行成功,时序图如下: ![image.png](https://static.studygolang.com/210711/469125aef5911ad16ec5446e4fe0f8b3.png) 如果TransOut成功、而TransIn失败,时序图如下: ![image.png](https://static.studygolang.com/210711/6420c2466a41324b1cd17cc8a280017e.png) 如果您需要进一步了解上述例子,可以移步[yedf/dtm](https://github.com/yedf/dtm)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1630 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传