Go Mysql Driver 集成 Seata-Golang 解决分布式事务问题

简介: 2020 年 4 月,我们开始尝试实现 go 语言的分布式事务框架 Seata-Golang。众所周知,Seata AT 模式以无业务代码侵入的特点,被广大开发者推崇。Java 版 Seata AT 模式通过对 DataSource 数据源进行代理,在 sql 语句执行时,对 sql 拦截解析,获取数据库对应数据在 sql 语句执行前后的副本,序列化后保存起来,在 TC 协调回滚时用来回滚对应数据。实现 go 版本 client 的 AT 模式时,怎样对业务开发者更友好,入侵更少,成了首要考虑的目标。

头图.png

作者 | 刘晓敏  GitHub ID:dk-lockdown
来源 | 阿里巴巴云原生公众号

背景

2020 年 4 月,我们开始尝试实现 go 语言的分布式事务框架 Seata-Golang。众所周知,Seata AT 模式以无业务代码侵入的特点,被广大开发者推崇。Java 版 Seata AT 模式通过对 DataSource 数据源进行代理,在 sql 语句执行时,对 sql 拦截解析,获取数据库对应数据在 sql 语句执行前后的副本,序列化后保存起来,在 TC 协调回滚时用来回滚对应数据。实现 go 版本 client 的 AT 模式时,怎样对业务开发者更友好,入侵更少,成了首要考虑的目标。

1.png

使用 go 操作数据库时,我们会使用到 go 语言的官方库 database/sql,通过 sql.Open("mysql", ${dsn}) 获取一个数据源操作对象 db。开启事务时,使用 db.Begin() 或 db.BeginTx(ctx, &sql.TxOptions{}) 获得事务操作对象 tx,执行 sql 查询使用 tx.Query;执行 sql 新增、修改、删除,使用 tx.Exec;最后使用 tx.Commit() 提交或使用 tx.Rollback() 回滚。

go 语言官方库 database/sql 提供了一个标准抽象层,通过实现不同的 driver 一套标准的抽象 API 可以操作不同的数据库。开发 Go 版本的 AT 模式,必然要兼容 database/sql。通过研究 database/sql 的 api,创建数据源操作对象,数据库有关的配置必须通过 Data Source Name (DSN) 抽象传递进去,下面是 DSN 的定义:

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

实现 AT 模式对数据源代理是需要和事务协调器 TC 进行交互的,如果将 AT 模式实现在 driver 层,那么和 TC 交互的一些参数必须要通过 DSN 传递到 driver,这样有些破坏它的设计。所以,最后采取了一种折中方案,在 database/sql 层之上实现 AT 模式,代理 database/sql 创建出来的数据源操作对象。数据源代理对象实现 database/sql 库定义的 Tx 接口,另外再提供一个开启事务的方法:Begin(),虽然没有完全兼容 database/sql 的 api,但是关键接口和它的定义成一样,勉强还能接受。到此,Seata-Golang 项目核心功能的开发已完成。

type Tx interface {Commit() errorRollback() error
}

转折

Seata-Golang  开源后,逐渐被一些开发者了解和接触,社区也对 Seata-Golang 发出了一些反馈的声音,不少开发者并不习惯写原生 sql,他们希望将 Seata-Golang 集成到 ORM 框架,因为当时的设计没有完全兼容 database/sql 导致集成上遇到一些困难。随着社区的热切呼唤,且得益于前期对 driver 的一些研究,念念不忘必有回响,今年 3 月突然灵感迸发:为什么参数一定要通过 DSN 传递?Seata-Golang Client 初始化后,在需要时通过 Client 端的 API config.GetATConfig() 直接获取使用不就可以了。

2.png

于是工作之余,历时 2 周开发,第一个集成 Seata-Golang 的完全兼容 database/sql 的 mysql driver 被开发出来,项目开源在 https://github.com/opentrx/mysql,现处于 beta 状态,希望社区开发者使用后能有一些反馈,可通过例子:https://github.com/opentrx/seata-go-samples,查看使用方式并进行测试。

driver 的一些细节

  • 使用该 driver 进行分布式事务操作时,不能在 dsn 中设置 interpolateParams 参数为 true

这涉及到 mysql 的两个协议:Text 协议和 Binary 协议。有关两个协议的区别,可以在文末参考文档找到资料。实现该 driver 只对 binary 协议进行了处理,开启 interpolateParams 会使用 text 协议执行 sql。

  • 使用该 driver 在需要加入全局事务组和 tc 进行交互时,需要使用 db.BeginTx(ctx context.Context, opts driver.TxOptions) 方法,并在 ctx 中加入 XID 全局事务 id 的值
ctx := context.WithValue(context.Background(), mysql.XID, c.Request.Header.Get("XID"))
tx, err := dao.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelDefault,ReadOnly:  false,})

XID 传递到 driver 层,会保存在 &mysqlConn 连接对象中,在和 TC 交互时用到。

  • 使用该 driver 的分布式事务功能前需要先初始化 seata-golang client 和 mysql driver
  config.InitConf(configPath)client.NewRpcClient()mysql.InitDataResourceManager()mysql.RegisterResource(config.GetATConfig().DSN)

具体可参考 seata-go-samples。

寄语

此项目开源到今年 4 月即满一年,通过本文中的 mysql driver,希望能降低使用门槛,让大家真正用起来,大家在选择微服务开发技术栈时也不用担心 go 语言没有分布式事务处理方案。

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装redis提示[test] error 2_技术干货分享:一次flask+redis的微服务实战

先说一下需求的场景,策划部门想做一个垂直领域的社区产品,类似与知乎那种,但受益人群是金融行业的从业人员。产品中有一个搜索问题的需求,搜索的问题去题库中进行模糊匹配,终端支持H5/APP/小程序,甚至是微信…

实现阿里云容器镜像服务反向访问代理

简介: 本文会先介绍镜像推送/拉取过程的交互逻辑来梳理需要代理的所有服务,再通过搭建一个公网 HTTPS 反向代理来访问容器镜像服务来向您展示多场景代理访问模式原理。 真实业务场景可能很复杂,因安全、合规、访问限制等原因可能需要&#x…

数字基础设施开源操作系统欧拉全新发布

在华为全联接2021上,面向数字基础设施的开源操作系统欧拉(openEuler)全新发布。欧拉操作系统可广泛部署于服务器、云计算、边缘计算、嵌入式等各种形态设备,应用场景覆盖IT(Information Technology)、CT&am…

mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...

阅读文本大概需要3分钟。MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes )。以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引。如果表上定义有主…

共筑计算新生态 共赢数字新时代

[中国,深圳,2021年9月25日] 在华为全联接2021上,华为副总裁、计算产品线总裁邓泰华分享了六大数字生态的最新进展,并携手生态伙伴为计算产业带来一系列重磅内容:欧拉开源操作系统(openEuler)全新…

数据湖,已成为海量数据存储与分析的重要承载方式

简介: 在云计算和大数据时代,基于数据开展生产、运营、决策成为常态,根据Gartner报道,2019年数据基建方面的采购费用飙升到660亿美元,占据基础架构类软件费用的24%。数据的存储及应用体系是企业生态运转的中枢神经&…

Fluid 0.5 版本发布:开启数据集缓存在线弹性扩缩容之路

简介: 为了解决大数据、AI 等数据密集型应用在云原生场景下,面临的异构数据源访问复杂、存算分离 I/O 速度慢、场景感知弱调度低效等痛点问题,南京大学PASALab、阿里巴巴、Alluxio 在 2020 年 6 月份联合发起了开源项目 Fluid。 作者 | 顾荣 …

php生成cookie在哪,php程序中cookie的使用方法

Cookie 可以翻译为“小甜品,小饼干” ,Cookie 在网络系统中几乎无处不在,当我们浏览以前访问过的网站时,网页中可能会出现 :你好 XXX,这会让我们感觉很亲切,就好像吃了一个小甜品一样。这其实是…

c#类属性和实例属性_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...

定义类类由class member类成员组成,包含字段、属性、方法和事件。其中字段和属性为类的数据成员,用来存储数据;方法负责数据的传递和运算。使用类之前,要进行声明,声明的语法如下:Class 类名称{访问权限 数…

面对不可避免的故障,我们造了一个“上帝视角”的控制台

简介: 混沌工程随着云原生的发展逐渐进入大家的视野,通过混沌工程可以很好地发现和解决在云原生化过程中的高可用问题。阿里巴巴在 2019 年开源了底层的混沌工程工具 - chaosblade,今年年初再次开源混沌工程控制台 chaosblade-box&#xff0c…

腾讯云鼎实验室发布云安全攻防矩阵,绘制九大攻防路径全景图

随着云计算技术和产业的蓬勃发展,企业上云已是数字化转型的必然趋势。但云上千般好,却也给企业带来了全新的安全挑战。云平台不仅要应对传统网络架构中存有的DDoS、入侵、病毒等常态问题,还要高度重视技术架构中虚拟机逃逸、资源滥用、横向穿…

Knativa 基于流量的灰度发布和自动弹性实践

简介: Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量,在高峰时自动扩容实例数;当请求量减少以后,自动缩容实例,做到自动化地节省资源成本。此外,Knative 还提供了基于流量的灰度…

nginx 部署_部署 hexo 到 nginx

本来博客是使用 GitHub pages ,但近些日子访问贼慢,刚好手里有一台小机器,当然是要用起来(折腾就对了 )。前置条件:已购买 vps 和域名,按需备案。ssh 登录远程服务器,以 CentOS 为例…

阿里云云效技术专家:一文详解kubernetes下5种常见发布模式如何选择

简介: Kubernetes下5场场景应用发布方式的选择,每种发布模式适合什么样的场景,以及如何在阿里云云效上高效落地。 作者:郑云龙,阿里云云效技术专家 Kubernetes面向通用场景提供了非常灵活的应用管理和运维方式&#…

“西部云安全优才计划”落地西安,为云安全高质量发展夯实才智支撑

9月26日,2021首届-西部云安全峰会在西安顺利召开。聚焦西部云安全发展和人才培养需求,在本次峰会上,腾讯安全云鼎实验室、陕西省计算机学会联合西安多所高校发布了“西部云安全优才计划”,凝聚西安以及西部的安全力量,…

如何做一场高质量的分享?

简介: 最近我发现一些同学的分享越来越趋于“念稿”式。我一边看着分享的同学在上面念稿,另一边看着几十号人在下面看电脑看手机,我心里就特别着急。恨不得我自己上去讲,也恨不得没收了大家的电脑手机。但这种粗暴的方法肯定是不解…

matlab knn实现,Matlab之KNN实现

1. 算法流程1) 通过Matlab产生高斯分布产生两类数据,并标明类别2) 数据初始化:设置K某个常数(一般为奇数)3) 对于每个测试数据,计算其到两类数据的所有点的距离对于上述求得的距离,选出K个最小的,检…

matlab 计算 工程,matlab工程计算.doc

您所在位置:网站首页 > 海量文档&nbsp>&nbsp计算机&nbsp>&nbspmatlabmatlab工程计算.doc167页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整性,不预览、不比…

matlab制作打地鼠游戏,scratch编程制作打地鼠的游戏教程

scratch编程制作打地鼠的游戏教程Sk1少儿编程网-https://www.pxcodes.comSk1少儿编程网-https://www.pxcodes.com首先,新建背景和角色,从背景库/角色库中分别选择森林和地鼠、锤子Sk1少儿编程网-https://www.pxcodes.com1.角色:洞Sk1少儿编程…

php301重定向跳转,php如何设置301重定向跳转

php设置301重定向跳转的方法:在跳转前设置状态码【header( "HTTP/1.1 301 Moved Permanently" );header("Location:your_dest_url")】。本教程操作环境:windows7系统、PHP5.6版,DELL G3电脑,该方法适用于所有…