分布式事务管理器dtm第二篇:saga模式

参考官方中文文档:https://dtm.pub/practice/saga.html

saga核心思想是把一个长事务拆分多个短事务,由dtm协调,如果每个短事务都成功提交,那么全局事务就正常完成,如果某个步骤失败,则根据相反顺序调用补偿操作。

以转账为例,saga的时序图如下:

AP把事务的编排信息提交给服务器后,即使宕机也不影响事务的进行。dtm会步骤执行逻辑。

代码示例:

req := &gin.H{"amount": 30} // 微服务的请求Body
// DtmServer为DTM服务的地址
saga := dtmcli.NewSaga(DtmServer, shortuuid.New()).
  // 添加一个TransOut的子事务,正向操作为url: qsBusi+"/TransOut", 逆向操作为url: qsBusi+"/TransOutCompensate"
  Add(qsBusi+"/TransOut", qsBusi+"/TransOutCompensate", req).
  // 添加一个TransIn的子事务,正向操作为url: qsBusi+"/TransIn", 逆向操作为url: qsBusi+"/TransInCompensate"
  Add(qsBusi+"/TransIn", qsBusi+"/TransInCompensate", req)
// 提交saga事务,dtm会完成所有的子事务/回滚所有的子事务
err := saga.Submit()

以上是AP中的代码。dtmcli是github.com/dtm-labs/client即dtm go sdk中的包。qsBusi+"/TransOut"、qsBusi+"/TransOutCompensate"是RM1的接口,分别负责金额的转出及其补偿操作即增加金额。qsBusi+"/TransIn"、qsBusi+"/TransInCompensate"是RM2的接口,分别负责金额的转入及其补偿操作即减少金额。如果是行内转账,则R1=R2。

如果TransIn返回,那么时序图为:

像洋葱似的,先执行的正向操作的补偿操作后执行。 

posted on 2023-02-02 20:10  koushr  阅读(155)  评论(0编辑  收藏  举报

导航