分布式事务管理器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返回,那么时序图为:
像洋葱似的,先执行的正向操作的补偿操作后执行。