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

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 解决分布式事务问题

seata-golang 一周年回顾相关推荐

  1. 花开再会,BIGBANG十周年回顾大展北京站于12月7日开幕

    韩国YG娱乐与中国大陆联合出品方CASHART携手主办的BIGBANG十周年回顾大展"BIGBANG10 THE EXHIBITION: A TO Z"今夏已在大陆首站上海掀起了思 ...

  2. “哪怕有一天发不出工资,也会有人留下。”——九章智驾创业两周年回顾(上)...

    交流群 | 进"传感器群/滑板底盘群/汽车基础软件群/域控制器群"请扫描文末二维码,添加九章小助手,务必备注交流群名称 + 真实姓名 + 公司 + 职位(不备注无法通过好友验证) ...

  3. 属于db模式缺点的是什么_详解 Seata Golang 客户端 AT 模式及其使用

    源码:point_down: seata-golang 概述 我们知道 Seata Java Client 的 AT 模式,通过代理数据源,实现了对业务代码无侵入的分布式事务协调机制,将与 Trans ...

  4. unity怪物攻击玩家减血_怪物猎人发布15周年 — 回顾历代封面怪之三大传奇怪物...

    本文来自Jump用户投稿,作者:水熊 2019年3月正逢怪物猎人发布15周年之际,CAPCOM官方网站公布了本次15周年庆典的主题图片. (转自CAPCOM官网,本次15周年主题图片为历代怪物猎人作品 ...

  5. iPhone五周年回顾:微软CEO五年前曾对iPhone呲之以鼻

    6月29日是iPhone的五周年生日,对于苹果来说,过去的5年是令人难以置信的5年,苹果已售出2.5亿台iPhone,并累积获得1500亿美元的收入,每年创造利润达30亿美元,苹果的市值也从全球第44 ...

  6. 《Booth 空箱》发售一周年回顾

    大家好,距离那个战战兢兢按下 Steam 后台发售键的夜晚已经过去整整一年,而我也终于准备好了(打败拖延)来聊一聊我创作的第一款独立游戏<Booth 空箱>.如果你对游戏创作感兴趣,或者想 ...

  7. RTC月度小报6月 |编程挑战赛圆满收官;声网上市1周年回顾...

    本月亮点速览 产品与技术: 声网Agora 实时音视频服务正式上线 HTC VIVE Sync App,支持非 VR 用户 「灵动课堂」发布 1.1.2 版本 「互动直播」6 月共发布两个版,最新版本 ...

  8. 暴雪经典即时战略游戏十周年回顾

    随便打开一本游戏杂志,被玩家讨论最多的游戏,开发者基本都是他:能做到一个网络游戏还没开始测试,就能占据玩家心目中第一位置的,也是他:一个游戏公司自从确立自己名称之后至今还没有开发过失败游戏的,同样是他 ...

  9. 首个由国内发起的分布式消息领域的国际标准OpenMessaging一周年回顾

    近日,浩鲸科技和京东先后宣布正式加入Linux基金会旗下OpenMessaging开源标准社区,并承诺将与OpenMessaging开源标准社区共同努力营造良好的开源环境,打造厂商中立,面向 Clou ...

最新文章

  1. Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)
  2. 03、NavMesh--导航网格寻路
  3. Nginx与Tomcat实现请求动态数据与请求静态资源的分离
  4. Java怎么学?实用的学习路线图分享
  5. 一个 WordPress 安装,多个博客
  6. python两个 list 获取交集,并集,差集的方法
  7. Arcgis server——arcgis server manager忘记密码
  8. PHP生成TXT文件并自动下载
  9. 用python实现pdf转word(带格式)_Python 实现加密过的PDF文件转WORD格式
  10. 昂达平板不能开机刷机_昂达平板刷机V811 V701 V702 V711刷错固件刷回方法
  11. EhCache的使用
  12. Datawhale打卡第2次
  13. 微信公众号排版学习之图片篇
  14. 短视频直播系统的功能
  15. 珍藏书籍,人工智能书籍推荐--AI“圣经”/超详细计算机视觉书籍赠送
  16. JavaScript高级之42个英语单词
  17. win10纯净版安装教程
  18. mybatis自联表三级菜单
  19. gcc -shared -o libJava.so Java.o ./libdemo.a
  20. 【涨知识】国内外点云处理著名研究团队

热门文章

  1. 攻击者怎样使用HTML和CSS隐藏“外部发件人”电子邮件警告
  2. Windows x64内核学习笔记(五)—— KPTI(未完待续)
  3. 22、Java Swing JTable:表格
  4. 1105 Spiral Matrix (25 分)【难度: 一般 / 知识点: 模拟】
  5. python读文件去除空行_「34」Python文件操作经典案例:CSV文件的读与写
  6. 【数据结构-查找】1.通俗易懂讲解 —— 顺序-折半-分块查找
  7. 能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮,真TMD香!
  8. 你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗?
  9. mysql:Column id cannot be null
  10. Tomcat如何将项目发布到webapps目录下