乐趣区

关于云原生:seatagolang-一周年回顾

作者 | 刘晓敏
起源 | 阿里巴巴云原生公众号

Seata 是一款简略易用,高性能、开源的一站式分布式事务解决方案。Seata 从 2019 年 1 月开源后就受到了大家的追捧,目前曾经有几百家企业在生产环境进行了技术的落地。

2020 年 4 月,咱们开始基于 Seata 着手做多语言 golang 我的项目,通过一年工夫的开发,很快乐 seata-golang 公布了 1.0.0 版本。

往年 4 月 17 号,有幸在成都 gopher meetup 上将 seata-golang 介绍给热衷于 golang 的 gopher。

会上咱们向大家演示了如何利用 seata-golang 来接入到微服务中保障服务间的数据一致性,另外还向大家介绍了 Seata 的外围原理、MySQL driver 原理和接入、seata-golang 的将来布局,最初就大家关注的 Seata 相干的问题做了 QA。

Seata 原理

流动上,咱们联合 seata-golang 的 demo 和大家分享了 seata 的工作原理。如下图所示,是一个 seata at 模式的简略工作流程。

  • TC(即图中右半局部):Transaction coordinator,它是一个分布式事务协调器。
  • TM:Transaction manager,它是一个事务管理器,负责全局事务的开启、提交和回滚。
  • RM:Resource Manager,它是治理分支事务资源的,它退出全局事务组后,向 TC 报告分支事务的执行状态。
  • XID:TM 开启全局事务时,会在 TC 创立一个 GlobalSession,GlobalSession 的全局惟一标识即为 XID。
  • BranchID:RM 向 TC 注册分支事务后,在 TC 侧生成一个 BranchSession,BranchID 全局惟一标识这个 BranchSession。

当 RM 向 TC 报告分支执行失败时,TC 会标记这个 BranchSession 的状态为失败,而后 TM 发动回滚时,TC 依据 XID 找到所有胜利执行的事务分支,告诉他们进行回滚。

MySQL Driver

最近研发开源进去的 mysql driver 我的项目,基于 go-sql-driver/mysql 1.5.0 版本开发,人造集成了 seata-golang 的分布式事务能力,齐全反对 database/sql 库这层形象,因为很多 orm 框架都基于 database/sql 做了封装,所以对 database/sql 的反对意味着 seata-golang 能够完满无缝地接入各种 orm 框架。

driver 的 mysqlTx 对象执行 Commit 或者 Rollback 时,会依据 mysqlConn 的 connCtx 是否有值来决定是否和 tc 交互,报告分支事务的执行状态。如果执行 Commit,connCtx 有值则把 sqlUndoItemsBuffer 中的 undoLog 和业务数据一起提交到数据库,而后报告 tc 事务分支提交的状态(胜利还是失败),否则执行失常的提交。如果执行 Rollback,connCtx 有值则回滚而后向 tc 报告分支执行失败,tc 会依据这个状态回滚整个全局事务,connCtx 没有值则只需失常回滚。

上图是 undoLog json 序列化后的构造数据,咱们能够看到这条数据批改之前,它的 name 是“TXC”,批改之后它的 name 是“GTS”,如果对它进行回滚,则生成一个反向的弥补语句:update product set name = ‘TXC’ since = 2014 where id = 1。如果是 insert 操作,则反向弥补操作为 delete,如果是一个 delete 操作则方向弥补操作为 insert。

将来布局

社区曾经有小伙伴将 mysql driver 集成到 gorm,并将 seata-golang 用到生产环境。目前 seata-golang 只反对 mysql,小伙伴们可依据 mysql driver 的思路,实现 pgsql 和 oracle 的 driver。这也是将来 seata-golang  将要布局做的事件之一。

随着 go 语言微服务开发的衰亡,分布式事务问题会越来越受到关注,心愿社区的敌人能够更多参加进来欠缺这个框架,让它施展生命力、服务社区、发明价值。

如果你有任何疑难,欢送钉钉搜寻群号退出交换群【钉钉群号 33069364】。

作者简介

刘晓敏(GitHubID dk-lockdown),目前就任于 h3c 成都分公司,善于应用 Java/Go 语言,在云原生和微服务相干技术方向均有涉猎,目前专攻分布式事务。

参考资料

  • seata 官网:https://seata.io
  • java 版 seata:https://github.com/seata/seata
  • seata-golang 我的项目地址:https://github.com/opentrx/seata-golang
  • driver 地址:https://github.com/opentrx/mysql
  • seata-golang go 夜读 b 站分享:https://www.bilibili.com/video/BV1oz411e72T
  • 基于 getty 的 seata-golang 通信模型详解:http://seata.io/zh-cn/blog/seata-golang-communication-mode.html
  • seata-golang 接入指南
  • Go Mysql Driver 集成 Seata-Golang 解决分布式事务问题
退出移动版