最强分布式事务框架怎样炼成的?
一、什么是事件驱动架构
事件驱动架构是一种促进生产的软件架构范式。事件驱动架构在用微服务构建的现代应用中非常普遍,它用事件来触发、解耦服务之间的通信。事件可以是状态的变更,比如将商品放入购物车;也可以是某种标识,比如订单的发货通知。
在传统的软件架构中,应用逻辑是通过请求、过程驱动的。一个请求执行一段逻辑同步返回一个响应,在业务逻辑中,将要执行的代码按照过程顺序进行编排。而事件驱动架构中,事件消费者会以异步的方式处理事件生产者产生的事件,原来过程当中的逻辑交给事件消费者去处理,解开服务之间的耦合,使应用的逻辑聚焦,应用的职责单一,代码更加简洁,也能提升系统的响应能力。
二、分布式事务的事件驱动架构
在 2020 年,本文作者开源了 Go 语言的分布式事务框架 Seata-Golang。Seata-Golang 实现 AT 模式和 TCC 模式,这两种模式都是过程驱动。到了 2022 年,随着对云原生技术的理解深入,从 Kubernetes Control-Loop 思想中获得灵感,全新设计了高性能、无侵入、事件驱动的 Go 语言分布式事务框架 hptx,以及支持跨语言分布式事务、读写分离、分库分表的 Mesh 方案 DBPack。这两款产品都能解决分布式事务问题,前者只支持 Go 语言,后者支持任意编程语言。他们采用了相同的事件驱动架构。下面进行详细的说明。
过程驱动
在 Seata 的设计中,事务发起者发起全局提交后,首先会判断该事务是否允许异步提交,如果允许,则直接返回提交成功,然后由 AsyncCommittingSessionManager
来异步地通知每个分支事务提交,AT 事务默认允许异步提交。如果不允许异步提交,事务协调者会依次通知全局事务参与者即每个分支事务提交,所有分支事务提交成功后,同步返回给事务发起者全局事务提交的结果,如上图。事务协调者通知事务参与者提交过程中发生了异常,会将该全局事务标记为 CommitRetrying
状态,将会有一个 RetryCommittingSessionManager
定时从持久存储中捞取标记的全局事务重试提交。
全局回滚的过程与上图类似,全局回滚时,AT 模式和 TCC 模式都是同步执行,依次通知每个分支事务回滚,然后再响应回滚结果给事务发起者。如果回滚失败,则将全局事务标记为 RollbackRetrying
,由 RetryRollbackingSessionManager
定时捞取标记的全局事务数据重试回滚。
Seata-Golang 的用户经常会问一个问题,事务协调者 TC Server 怎么做高可用?Seata 包括 Seata-Golang 默认推荐使用 Mysql 数据库作为 TC 状态数据的持久化存储。TC Server 本身则是无状态应用,可以部署多个副本,但这里就存在一个问题:多个对等副本里的 AsyncCommittingSessionManager
、RetryCommittingSessionManager
、RetryRollbackingSessionManager
都会从数据库去捞取对应的数据执行,会导致事务的提交、回滚重复执行,虽然 AT 模式天然做到幂等,TCC 模式由用户保证幂等,但总是存在一定的资源浪费,且不够优雅。
事件驱动
上图展示了 hptx 和 dbpack 的事务协调逻辑,事务发起者 AggregationSvc 发起全局事务提交、回滚,仅仅是修改 ETCD 中的数据状态,然后立即返回。订单服务和商品服务使用前缀 bs/${appid}
Watch 存储在 ETCD 中的分支事务数据,当分支事务的数据发生过变更后,ETCD 马上推送一个变更事件给相应服务,订单服务和商品服务收到变更事件后,将数据加入 workqueue
去执行提交或回滚的逻辑。AggregationSvc 提交、回滚时不会调用 OrderSvc、ProductSvc 的接口,整个过程通过 ETCD 解耦后异步执行。
![](/assets/blank.gif)
事务分支提交或者回滚失败后,会重新进入到 workqueue
当中继续消费,直至提交、回滚成功,或回滚超时(AT 模式回滚操作涉及到全局锁的释放,需要设置超时时间,即 retry_dead_threshold
)。
在这个架构中,已经没有中心化事务协调者 TC Server,用户只需要关心自身应用的高可用,如果应用多副本部署,hptx 和 dbpack 会通过 etcd 选主,只有选为 master 的副本才能 watch 自身产生的分支事务数据去做提交、回滚,避免了提交、回滚逻辑重复执行的问题。集成 hptx,只需要依赖相应的 sdk,而不需要部署额外的 TC Server,但状态数据的存储由原来的 Mysql 换成了 ETCD。
三、新架构带来的好处
全新的、云原生的、事件驱动架构,更加简洁,性能更强。采用 hptx 的应用事务协调性能比 Seata-Golang 提升 1 倍,通过 dbpack 以 mesh 方式协调分布式事务性能比 seata-golang 提升了百分之 50。下面是一些测试数据:
环境 | 性能 | |
---|---|---|
seata-golang | 2018 款 Mac book pro | 每秒 18.54 笔事务 |
hptx | 2018 款 Mac book pro | 每秒 38.89 笔事务 |
dbpack | 2018 款 Mac book pro | 每秒 28.09 笔事务 |
hptx | 阿里云 ecs ecs.sn1ne.xlarge (4 核 8G) | 每秒 35.15 笔事务 |
hptx 是当前性能最强的云原生、无侵入分布式事务解决方案,选择其他内存型存储组件理论上可以得到更高的性能,但综合可靠性和性能,ETCD 是目前最好的选择。
四、结语
经过持续地在分布式事务领域的研究总结,使分布式事务框架不断进化,从最初的兼容 java seata 的 seata-golang v1 版本,到云原生的、无侵入的、基于 grpc 的 seata-golang v2 版本,到基于 ETCD watch 机制的、事件驱动的 hptx,再到跨语言的 dbpack,分布式事务一直在进化,能力也在进一步增强。
欢迎感兴趣的同学加入我们社区一起交流讨论分布式事务问题、DBMesh 问题,进群或参与社区建设请添加微信:scottlewis。
链接
Hptx 项目地址:GitHub - CECTC/hptx: high-performance non-intrusive distributed transaction solution, inspired by kubernetes, only for golang language.
Hptx samples:GitHub - CECTC/hptx-samples: samples for hptx
DBPack 项目地址:https://github.com/cectc/dbpack
DBPack 文档:DBPack 文档
DBPack-samples:GitHub - CECTC/dbpack-samples: samples for dbpack, dbpack support any languages, and there are go、java、php、python samples
最强分布式事务框架怎样炼成的?相关推荐
- 分布式事务框架Seata的使用
1. 分布式事务入门 事务必须具有的四个特性分别是:原子性(atomicity).一致性(consistency).隔离性(isolation,又称独立性)以及持久性(durability).这就是事 ...
- 手写基于Spring Cloud的TCC分布式事务框架
如何简单实现TCC分布式事务框架 最近听到很多其他公司的小伙伴谈分布式事务的问题,各种业务场景都有,可能就是这两年很多公司都在往微服务发展,现在各个子系统都拆分.建设的差不多了,实现了模块化开发,但是 ...
- 老板现在喊我大哥,原因是我用阿里分布式事务框架Seata解决了长久以来困扰公司的分布式事务问题
大家好,我是曹尼玛 从大学毕业5年,一直努力学习,努力工作,追求新技术,不保守. 上个月我来到一家新公司上班,月薪20K,这家公司老板人很好,对员工很关爱,公司氛围不错,同事们也努力把公司项目搞搞好. ...
- 分布式事务框架 seata-golang 通信模型详解
作者 | 刘晓敏 于雨 一.简介 Java 的世界里,大家广泛使用的一个高性能网络通信框架 netty,很多 RPC 框架都是基于 netty 来实现的.在 golang 的世界里,getty 也是一 ...
- 关于seata分布式事务框架的几个问题
本文来说下关于seata分布式事务框架的几个问题 文章目录 概述 Seata 分布式事务解决方案比较 本文小结 概述 seata是两阶段提交事务,第一阶段解析业务sql并且生成对应快照,第二阶段是提交 ...
- 分布式事务框架lcn入门demo
文章目录 简介 实现原理 入门demo 简介 LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果. LCN5.0.2有3种模式,分别是LCN模式,TCC模式,TX ...
- 阿里分布式事务框架Seata,AT模式原理解析
什么是分布式事务 如今在分布式技术盛行下,许多公司都已经在使用分布式技术了,虽然分布式技术给我们项目带来了三高(高可用,高扩展,高性能)等优点,但是缺点也很明显,分布式项目一般都是分服务开发,且多个服 ...
- 分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ
分布式事务--分布式事务简介.分布式事务框架 Seata(AT模式.Tcc模式.Tcc Vs AT).分布式事务--MQ 一.分布式事务简介 如果不是分布式环境的话一般不会接触到这种,一旦是微服务这种 ...
- 阿里分布式事务框架Seata集成详情
大家好,我是曹尼玛 从大学毕业5年,一直努力学习,努力工作,追求新技术,不保守. 上个月我来到一家新公司上班,月薪20K,这家公司老板人很好,对员工很关爱,公司氛围不错,同事们也努力把公司项目搞搞好. ...
最新文章
- oracle top用法
- Java开发面试题,Spring面试题整理(1)
- 常见架构TLB miss处理方法(转)
- oracle如何导出和导入数据库/表
- Oracle笔记 三、function 、select
- mysql列连接_连接来自MySQL中不同表的列
- 201312-5 I’m stuck!
- centos php memcache扩展,linux centos 安装php的memcache扩展
- day43,使用朋友pyMySQL连接数据库
- 2021高考技能考试成绩查询,2021年临床技能考试成绩出来了!附查询方式
- jquery 图像滑块_jQuery CSS图像滑块–自行编写代码
- [codeVS1917] 深海机器人问题(费用流,拆边)
- 如何使用工具切换设备ip 电脑和手机怎么如何换ip?
- 网易新闻 鸿蒙,网易新闻鸿蒙版下载-网易新闻 鸿蒙版v78.5-PC6鸿蒙网
- Python使用 opencv对CT图进行医学处理
- 计算机体系结构 第三章 CPU性能公式 CPI相关计算
- 自动设置为兼容模式html,什么是兼容模式?
- SPSSAU入门---浅谈问卷设计到数据分析之间的联系
- JavaScript 数字转成大写“零壹贰叁肆伍陆柒捌玖”的方法
- Google点击没有反应怎么办?Google卸载不了怎么办?Google安装不了怎么办?