我们团队在引入go语言做微服务的过程中,遇见了分布式事务的强需求。我们的交易中心涉及大量的业务,包括了商品、库存、各弹钢琴的指法类营销活动、商品权限等等,按照我们微服务的设计,需要拆分到多个微服务。原先由本地事务保证的acid,现在需要分布式事务方案来保证交易的正确性。
我们调研了大量开源项目,发现只有java提供了分布式事务的中间件,其他语言,暂未发现成熟的方案。这种背景下,我们内部开发了针对go语言分布式事务的dtm项目,线上稳定之后,我们将它开源出来,github地址为:yedf/dtm 。
虽然dtm最初针对我们的go语言微服务,但是我们的设计方案,充分考虑了跨语言特性,将底层通信设计成http(未来会支持grpc),并且将客户端做的非常轻,代码量非常少。
下面我们来看一个go语言接入dtm的简单例子:
const dtmrver = "http://localhost:8080/api/dtmsvr"const startbusi = "http://localhost:8081/api/busi_saga"req := &gin.h{"amount": 30} // 微服务的负荷// 生成dtm的saga对象saga := dtm.saganew(dtmrver). // 添加两个子事务 add(startbusi+"/transout", startbusi+决明子荷叶茶功效"/transoutcompensate", req). add(startbusi+"/transin", startbusi+"/transincompen无常读后感sate", req) // 提交saga事务err := saga.commit()
上述提交到dtm的saga事务,包括了两个子事务,transout和transin,以及两个子事务对应的补偿事务。事务提交到dtm后,dtm保证transout transin要么全部执行成功,要么任何一个子事务失败,会将执行过的子事务,再执行相应的档案保密制度补偿事务。
如果transout、transin都执行成功,时序图如下:
如果transout成功、而transin失败,时序图如下:
如果您需要进一步了解上述例子,可以移步yedf/dtm 能够让您快速运行一个圆周率口诀表saga事务
本文发布于:2023-04-05 10:10:31,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/17025f5ed56ac6483bfc56fd9008e227.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:go语言实战项目(编程语言排行榜).doc
本文 PDF 下载地址:go语言实战项目(编程语言排行榜).pdf
留言与评论(共有 0 条评论) |