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中的包。
标签:事务,管理器,dtm,saga,TransOut,qsBusi,url From: https://www.cnblogs.com/koushr/p/17087288.html