seata-golang 一周年回顾

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
函数计算FC,每月15万CU 3个月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: Seata 是一款简单易用,高性能、开源的一站式分布式事务解决方案。Seata 从2019 年 1 月开源后就受到了大家的追捧,目前已经有几百家企业在生产环境进行了技术的落地。

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

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

2020 年 4 月,我们开始基于 Seata 着手做多语言 golang 项目,经过一年时间的开发,很高兴 seata-golang 发布了 1.0.0 版本。

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

1.png

2.png

会上我们向大家演示了如何利用 seata-golang 来接入到微服务中保证服务间的数据一致性,另外还向大家介绍了 Seata 的核心原理、MySQL driver 原理和接入、seata-golang 的未来规划,最后就大家关注的 Seata 相关的问题做了 QA。

3.png

Seata 原理

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

4.png

  • 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 框架。

5.png

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

6.png

上图是 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  将要规划做的事情之一。

7.png

随着 go 语言微服务开发的兴起,分布式事务问题会越来越受到关注,希望社区的朋友可以更多参与进来完善这个框架,让它发挥生命力、服务社区、创造价值。

如果你有任何疑问,欢迎钉钉扫码加入交流群【钉钉群号 33069364】:
8.png

作者简介

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

参考资料

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
算法 Java 调度
mybatis-plus中的雪花算法
主要介绍mybatis-plus中用到的雪花算法,如有错误或未考虑完全的地方,望不吝赐教。这里默认大家对雪花算法有一定的了解哈
6519 1
mybatis-plus中的雪花算法
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
255434 0
|
存储 网络安全 API
|
消息中间件 Kubernetes Java
MQ产品使用合集之RocketMQ发消息失败了,proxy报connect to null failed如何解决
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
2040 2
MQ产品使用合集之RocketMQ发消息失败了,proxy报connect to null failed如何解决
|
NoSQL Nacos Redis
Seata 配置
Seata
694 2
|
网络协议 应用服务中间件 Linux
LINUX安装nginx详细步骤
LINUX安装nginx详细步骤
4908 1
|
存储 监控 Java
微服务轮子项目(22) -APM监控(SkyWalking)
微服务轮子项目(22) -APM监控(SkyWalking)
498 0
|
存储 监控 时序数据库
阿里巴巴 Sentinel + InfluxDB + Chronograf 实现监控大屏
前言 在上一篇推文中,我们使用时序数据库 InfluxDb 做了流控数据存储,但是数据存储不是目的,分析监控预警才是最终目标,那么问题来了,如何更好的实现呢?用过阿里巴巴 Sentinel 控制台的小伙伴,是不是觉得它的控制台丑爆了,而且只有短短的五厘米,显然不能满足大部分人或者场景的使用。
2641 0
|
XML 消息中间件 SpringCloudAlibaba
Spring——2、使用@ComponentScan自动扫描组件并指定扫描规则
在实际项目中,我们更多的是使用Spring的包扫描功能对项目中的包进行扫描,凡是在指定的包或其子包中的类上标注了@Repository、@Service、@Controller、@Component注解的类都会被扫描到,并将这个类注入到Spring容器中。 Spring包扫描功能可以使用XML配置文件进行配置,也可以直接使用@ComponentScan注解进行设置,使用@ComponentScan注解进行设置比使用XML配置文件来配置要简单的多。
688 0
Spring——2、使用@ComponentScan自动扫描组件并指定扫描规则