图片拍摄于2021年12月04日 山东青岛 我爱这座城市

开篇

上一篇那些用Go实现的分布式事务框架我们主要介绍的是seata-golang。一个对标seata的go语言实现,当然版本还是落后Java版很多的。

这次我们来介绍一下另一个go实现的分布式事务:dtm。

首先来看下dtm整体架构图(来源官网)。

再来看之前的seata架构图。

从架构上来看,大差不差。

seata中的TC对标dam的TM。

RM两边意思一致。

seata中的TM对标dtm事务SDK。作用都是一样:第一阶段开启一个全局事务,执行各RM分支事务,第二阶段根据RM第一阶段执行结果,决定调用TC(seata)|TM(dtm) commit或者rollback。

架构上,个人感觉只是因为模块名称以及图画不一样的差别,当然在实现细节上还是有很大差别的。

我们先简单介绍下DTM各个模块。

TM

TM 层在代码中是没有具体的主体结构的,开始都是函数之前的调用。

启动TM实际上开启了两个服务,http以及grpc这两个服务。

http路由,

gRPC接口,

即然提供了两个服务入口,那理所当然有公共处理核心业务的部分。

TM对数据的存储管理并不是依赖于接口,而是依赖于common.DB 结构。根据配置文件中DB.driver 的值决定底层数据库是mysql还是postgres两种。

再看这个DB结构,所以本质上无论底层是哪种数据库,都是直接依赖gorm来对数据进行操作的。

接着,看下TM是如何通知各个RM进行commit或者rollback的?

举一个TCC模式的例子。

TCC的两个阶段。

  • 阶段一: try。尝试执行,调用各RM自定义的try行为,预留必要的业务资源。

  • 阶段二:Confirm(阶段一所有参与本次事务的try行为都成功)。调用各分支事务的Confirm方法,真正执行业务,并且只使用try阶段预留的资源。

  • 阶段二:Cancel(阶段一任一参与本次事务的try行为失败)。调用各分支事务的Cancel方法,释放一阶段try所预留的资源。

从上面我们可以得知,TCC模式下,TM在第二阶段要么通知各分支事务Confirm要么Cancel。

在注册各RM事务分支到TM的时候,最终TM会为每一个分布式事务的参与者(RM)生成两条分支信息。

就像这样,

对,就是把对应的RM资源操作地址直接存入。

当TM接收到commit或者rollback命令,在处理完自身逻辑(一般就是修改Gloable状态),就需要开始处理每一个注册进来的分支事务了,说白了就是需要调用各个分支事务对应操作的接口。

这里的t.getProcessor() 是需要根据当前事务的类型(TCC、SAGA、XA)获取到对应的处理器来进行逻辑的处理。

当然,每个事务处理器只需要实现接口,

真正调用RM资源服务地址的时候,分为http和grpc,这是由开发者决定的。

在v1.6之前的版本,grpc的请求是很简单粗暴解析地址方法然后连接的。

现在为了支持那些采用gRPC Resolver 机制之上的一些微服务框架接入,做了一块抽象。感兴趣[1]可以看下,这里就不介绍了。

SDK

至于SDK,每一个事务模式都是独立的,本质上是没有关联的。比如下面我们启动一个TCC分布式事务。这个分布式事务是由两个服务组成,简称+30和-30的服务。

从上面的调用中我们还是能还原出整体流程。

  • 调用TM,得到一个分布式id

  • 调用TccGlobalTransaction函数开启分布式事务。

  • 调用TM prepare(这步只是为了查看第一步产生的那个分布式事务状态是否处于prepare。这里没看明白,此时还未注册执行分支,全局状态不是应该只会存在初始化状态吗)

  • 上一步没问题,执行传入的闭包函数,即CallBranch 函数里向TM注册参与事务的TM分支。注册完成后,开始第一阶段调用各分支的try服务。

  • 各分支try服务调用结束,根据第一阶段结果决定通知TM是submit还是abort。

另外提一点,分布式事务常见的一些问题:比如空补偿、重挂等问题。

一般情况下,业务需要自行去处理这种场景,以免造成不可描述的错误。

dtm里面提供了对应子事务屏障方案。核心就在,

其实就是利用数据库的唯一索引机制,当然每个RM资源你都得新增一张表。

上面提到,dtm的TM角色本质上就是对应 seata 中的 TC,但是他们的处理模式是不同的。

dtm中的TM会根据注册时的各分支保存的地址,决定通过http还是rpc调用各RM操作,是由TM直接发起对RM的请求。

seata-go的实现中,TC是不参与直接调用RM的。

还记得上篇提到一个双向流RPC接口(BranchCommunicate)。TC通过这个接口把对应分支处理信息传递给RM管理器。

然后由RM管理器根据事务类型选择对应的事务管理器进行处理,最终调用的是对应事务类型管理器的BranchCommit方法。

下面是一个TCC事务类型管理器的处理。

对应的事务RM管理器是如何通知、处理各个RM资源的。

原理就是我上篇提到的作者实现的一个全局事务代理模式,本质上是利用go的反射实现的,感兴趣的可以自己去扒下源码,也可以看看作者对实现全局事务代理的介绍[2]。

总结

这篇文章主要介绍了dtm实现的一些细节,从这两篇文章大体能看出实现上的部分区别,更多的细节还得靠自己去挖掘。

最后再问几个问题,

  • 日常开发中你们哪些场景是用到了分布式事务?用的是哪个框架还是自研的?

  • 或者说在分布式环境下,一致性的问题你们是如何解决的?

相关

  • https://zhuanlan.zhihu.com/p/351391359

  • https://dtm.pub/protocol/support.html

- END -

扫码关注公众号「网管叨bi叨」

给网管个星标,第一时间吸我的知识 

那些用Go实现的分布式事务框架之DTM相关推荐

  1. 阿里分布式事务框架GTS开源了!

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 就在昨天,阿里分布式事务框架GTS开源了一个免费社区版Fescar,看到了这个消息内心非常的激动. ...

  2. 干货!如何设计实现一个通用的分布式事务框架?

    来源:https://www.bytesoft.org/ 一个TCC事务框架需要解决的当然是分布式事务的管理.关于TCC事务机制的介绍,可以参考TCC事务机制简介. TCC事务模型虽然说起来简单,然而 ...

  3. seata xid是什么_Seata 分布式事务框架

    本文首发于个人微信公众号<andyqian>, 期待你的关注~ 前言 上一篇文章<Seata 之 rm-datasource 源码解读>发出后.有很多同学对 Seata 是什么 ...

  4. 分布式事务框架 seata-golang 通信模型详解

    作者 | 刘晓敏 于雨 一.简介 Java 的世界里,大家广泛使用的一个高性能网络通信框架 netty,很多 RPC 框架都是基于 netty 来实现的.在 golang 的世界里,getty 也是一 ...

  5. seata xid是什么_阿里开源的分布式事务框架 Seata

    1. Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而来. Seata ...

  6. 基于SpringCloud的分布式事务框架(LCN)

    框架特点 支持各种基于spring的db框架 兼容springcloud.dubbo 使用简单,代码完全开源 基于切面的强一致性事务框架 高可用,模块可以依赖dubbo或springcloud的集群方 ...

  7. 分布式事务框架_阿里分布式事务框架GTS开源啦!

    点击上方"Java后端技术",选择"置顶或者星标" 每天带你看高清大图哦! 整理:开源中国 就在9号这天,阿里分布式事务框架GTS开源了一个免费社区版Fesca ...

  8. LCN分布式事务框架实战

    本文来写个LCN分布式事务框架实战例子 文章目录 概述 概述 lcn分布式事务教程https://www.codingapi.com/docs/txlcn-preface/

  9. 关于seata分布式事务框架的几个问题

    本文来说下关于seata分布式事务框架的几个问题 文章目录 概述 Seata 分布式事务解决方案比较 本文小结 概述 seata是两阶段提交事务,第一阶段解析业务sql并且生成对应快照,第二阶段是提交 ...

最新文章

  1. 为什么是hbase而不是mongodb
  2. 最新可用NOD32免ID升级服务器
  3. “约见”面试官系列之常见面试题之第五十二篇之标准模式和怪异模式(建议收藏)
  4. MFC多文档框架 基于CVIEW视图类正常显示超出屏幕范围的部分(支持BCG库绘图)
  5. Java如何读取mysql存入es_java循环读取mysql并存入java集合里
  6. 计蒜客 2016计蒜之道比赛 初赛第四场 记录
  7. 英雄联盟lol鼠标突然不能a兵了
  8. obs摄像头模糊_【OBS虚拟摄像头插件】OBS虚拟摄像头下载OBS VirtualCam v2020 官方版-趣致软件园...
  9. 什么是天灾人祸,天灾是智商比较低,什么是人祸,人祸就是自己还不努力
  10. 有声音显示音频服务器,Win7右下角声音图标显示音频服务未运行的解决方法小结...
  11. 如何理解DevOps
  12. python 输入输出重定向_输入输出重定向_清华尹成python入门教程_少儿编程视频-51CTO学院...
  13. 美国计算机加音乐专业,美国留学:原来这就是传说中炫酷到炸裂的电子音乐制作专业...
  14. 通俗易懂谈上拉电阻与下拉电阻
  15. Android触摸事件派发(一) ViewGroup的dispatchTouchEvent()
  16. HTML怎么设置下划线及去掉下划线
  17. 校友会排名2018计算机,2018校友会大学排名惨遭“打脸”,看教育部第四轮学科评估数据...
  18. 倒计时(Jquery插件)
  19. html如何使图片紧靠下方,CSS粘住固定底部的5种方法
  20. Nginx+Memcached+Tomcat集群配置实践(Sticky Session)

热门文章

  1. 阿里云数据中台训练营第一期圆满落幕
  2. 通过系统进程查找sql语句
  3. Python数据科学|第一章:数据科学家的武器库
  4. 第19章,运维自动化之系统安装
  5. CSS cursor 和 opacity 属性
  6. 感谢党,软考过了。系统集成项目管理project师
  7. jar包中的类如何读取包内和包外的配置文件
  8. linux访问windows共享目录开机自动挂载
  9. Spring 2.5新特性及架构图
  10. 问答一:回答高中生关于前端的疑问