那些用Go实现的分布式事务框架
开篇
最近对分布式事务产生了一些兴趣,查阅了一些文章以及论文。这篇文章主要介绍我看的两个项目,不涉及一些理论知识。
阿里开源版本的Seata,主要看了Go实现的seata-golang(落后java版)
以及前段时间很多公众号都发的dtm。
Seata简介
Seata是由阿里开源的分布式事务服务,目前为用户提供了AT、TCC、SAGA、XA的事务模式,整体采用的是两阶段提交协议。Go版的seata-golang 目前好像只实现了mysql的AT、TCC模式,作者现在不咋更新了。
Seata 有几个核心角色:
TC(Transaction Coordinator) -事务协调者。(维护全局和分支事务的状态,驱动全局事务提交或回滚)
TM(Transaction Manager)-事务管理器。(定义全局事务的范围:开始全局事务、提交或回滚全局事务。)
RM(Resource Manager)-资源管理器。(管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚)
当然这样看,可能还不是很理解,我拿一张官网的图加以解释。
从上图中可以看出,这三个角色所负责的工作如下,
TC
维护全局和分支事务状态,需要进行存储。
当一个分布式事务处理结束,需要通知到每个RM是commit还是rollback。
TM
向TC请求开启一个分布式事务,得到一个全局唯一的分布式id。
根据每个参与分布式事务的RM一阶段的反馈,决定二阶段向TC请求此次分布式事务是commit还是rollback(绝大部分场景下,一阶段任一RM失败,本次分布式事务失败)
RM
说的白一点就是管理参与分布式事务的各个服务(比如经典下单场景中涉及到的:订单服务、库存服务、营销服务等)
ps:个人感觉,这里的RM有点类似微服务中的中间处理层(专业术语他们管这叫bff->backend for fronted)。
一阶段 prepare 行为(主动):每个RM调用 自定义 的 prepare 逻辑。
二阶段 commit 行为(被动触发):如果本次分布式事务第一阶段全部RM成功,TC处理完自身状态变更后,调用各个RM自定义 的 commit 逻辑。(一阶段RM全部成功)
二阶段 rollback 行为(被动触发):如果本次分布式事务第一阶段任一RM失败,TC处理完自身状态变更后,调用各个RM自定义 的 rollback 逻辑。(一阶段任意RM失败)
好了。下面可以看看seata-golang 实现的一些细节了,seata-golang 底层采用gRPC进行通信。
seata-golang
我们先看RM部分结构。
至于managers,保存支持的各大事务模式实现(TCC、XA等),每个模式只需要实现此接口即可。
再看TC部分结构(去除部分字段)。
TC对数据的存储目前支持mysql和pgsql,即只要实现SessionManager接口,然后注入到SessionHolder的manager。
介绍完这两个基本结构,还记得我们上面说过他们之间的关系吗?
二阶段TC会根据当前事务状态去通知RM是commit还是rollback。
在初始化ResourceManager 的时候,
我们看到最终会调用TC一个 grpc 接口branchCommunicate。
对应到服务端。
我们知道gRPC有四种基础的通信模式。
一元模式(Unary RPC)
服务器端流RPC(Server Sreaming RPC)
客户端流RPC(Client Streaming RPC)
双向流RPC(Bidirectional Streaming RPC)
想要流的形式也很简单,只需要在proto方法定义中将对应的请求|响应 参数前加上stream标记,那么这个接口就是流式传送了。至于是哪种流,取决于你把stream加在哪边,如果请求和响应都加,那么就是双向流了。
客户端和服务端都可以通过stream.Send 发送请求,通过stream.Recv 接收数据。
当RM调用BranchCommunicate时,
最终处理分支事务调用manager.BranchCommit,
相应的,当TC被RM调用BranchCommunicate 后,
上面要发送给RM 通知commit 或者 rollback 数据是咋么来的呢?
当TC要通知RM进行分支commit 的时候,
最后一个就是TM,没啥理解难度。
其实seat-golang还有别的可以提一提的。
比如说,它里面通过go反射实现的动态代理功能(虽然我觉得完全没必要?),我懒得写了。
这篇文章再写就更长了,不继续写dtm了,感兴趣的留个言,我看看要不要写一篇dtm。
参考
https://seata.io/zh-cn/docs/overview/what-is-seata.html
https://github.com/opentrx/seata-golang
- END -
扫码关注公众号「网管叨bi叨」
给网管个星标,第一时间吸我的知识
那些用Go实现的分布式事务框架相关推荐
- 阿里分布式事务框架GTS开源了!
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 就在昨天,阿里分布式事务框架GTS开源了一个免费社区版Fescar,看到了这个消息内心非常的激动. ...
- 干货!如何设计实现一个通用的分布式事务框架?
来源:https://www.bytesoft.org/ 一个TCC事务框架需要解决的当然是分布式事务的管理.关于TCC事务机制的介绍,可以参考TCC事务机制简介. TCC事务模型虽然说起来简单,然而 ...
- seata xid是什么_Seata 分布式事务框架
本文首发于个人微信公众号<andyqian>, 期待你的关注~ 前言 上一篇文章<Seata 之 rm-datasource 源码解读>发出后.有很多同学对 Seata 是什么 ...
- 分布式事务框架 seata-golang 通信模型详解
作者 | 刘晓敏 于雨 一.简介 Java 的世界里,大家广泛使用的一个高性能网络通信框架 netty,很多 RPC 框架都是基于 netty 来实现的.在 golang 的世界里,getty 也是一 ...
- seata xid是什么_阿里开源的分布式事务框架 Seata
1. Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而来. Seata ...
- 基于SpringCloud的分布式事务框架(LCN)
框架特点 支持各种基于spring的db框架 兼容springcloud.dubbo 使用简单,代码完全开源 基于切面的强一致性事务框架 高可用,模块可以依赖dubbo或springcloud的集群方 ...
- 分布式事务框架_阿里分布式事务框架GTS开源啦!
点击上方"Java后端技术",选择"置顶或者星标" 每天带你看高清大图哦! 整理:开源中国 就在9号这天,阿里分布式事务框架GTS开源了一个免费社区版Fesca ...
- 那些用Go实现的分布式事务框架之DTM
图片拍摄于2021年12月04日 山东青岛 我爱这座城市 开篇 上一篇那些用Go实现的分布式事务框架我们主要介绍的是seata-golang.一个对标seata的go语言实现,当然版本还是落后Java ...
- LCN分布式事务框架实战
本文来写个LCN分布式事务框架实战例子 文章目录 概述 概述 lcn分布式事务教程https://www.codingapi.com/docs/txlcn-preface/
- 关于seata分布式事务框架的几个问题
本文来说下关于seata分布式事务框架的几个问题 文章目录 概述 Seata 分布式事务解决方案比较 本文小结 概述 seata是两阶段提交事务,第一阶段解析业务sql并且生成对应快照,第二阶段是提交 ...
最新文章
- 好的架构是有价值观的
- 抠图+修图+调色+合成+特效Photoshop核心应用5项修炼pdf
- Inf2Cat应用的参数使用详细介绍
- Css 选择器 算法 规则
- Win11锁屏快捷键是什么 Win11锁屏的方法
- 蛋壳公寓CEO高靖被限制消费
- HBase集成(准备篇)
- 将 azw3 格式转换为 epub和mobi 格式
- 国开电大0-3岁婴幼儿的保育与教育形考任务
- 使用selenium模拟动态登录百度页面
- 新手都能用到的140个电脑技巧
- 【学习笔记】windows快捷键
- 我彻底服了,大牛讲解信号与系统(通俗易懂)
- 教大家写几个可能用得上的css3简单动画
- 毕业设计 基于单片机的数字出租车计价器
- 使用GifCam工具上传GIF动态图至CSDN博客
- Spring官方文档解读(五)之自定义 bean 的性质
- 高频小信号谐振放大器【Multisim】【高频电子线路】
- debain 安装amd显卡驱动
- 优秀开源产品推荐:Tpflow工作流引擎