一、什么是事件驱动架构

事件驱动架构是一种促进生产的软件架构范式。事件驱动架构在用微服务构建的现代应用中非常普遍,它用事件来触发、解耦服务之间的通信。事件可以是状态的变更,比如将商品放入购物车;也可以是某种标识,比如订单的发货通知。

在传统的软件架构中,应用逻辑是通过请求、过程驱动的。一个请求执行一段逻辑同步返回一个响应,在业务逻辑中,将要执行的代码按照过程顺序进行编排。而事件驱动架构中,事件消费者会以异步的方式处理事件生产者产生的事件,原来过程当中的逻辑交给事件消费者去处理,解开服务之间的耦合,使应用的逻辑聚焦,应用的职责单一,代码更加简洁,也能提升系统的响应能力。

二、分布式事务的事件驱动架构

在 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 本身则是无状态应用,可以部署多个副本,但这里就存在一个问题:多个对等副本里的 AsyncCommittingSessionManagerRetryCommittingSessionManagerRetryRollbackingSessionManager 都会从数据库去捞取对应的数据执行,会导致事务的提交、回滚重复执行,虽然 AT 模式天然做到幂等,TCC 模式由用户保证幂等,但总是存在一定的资源浪费,且不够优雅。

事件驱动

上图展示了 hptx 和 dbpack 的事务协调逻辑,事务发起者 AggregationSvc 发起全局事务提交、回滚,仅仅是修改 ETCD 中的数据状态,然后立即返回。订单服务和商品服务使用前缀 bs/${appid} Watch 存储在 ETCD 中的分支事务数据,当分支事务的数据发生过变更后,ETCD 马上推送一个变更事件给相应服务,订单服务和商品服务收到变更事件后,将数据加入 workqueue 去执行提交或回滚的逻辑。AggregationSvc 提交、回滚时不会调用 OrderSvc、ProductSvc 的接口,整个过程通过 ETCD 解耦后异步执行。

事务分支提交或者回滚失败后,会重新进入到 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

最强分布式事务框架怎样炼成的?相关推荐

  1. 分布式事务框架Seata的使用

    1. 分布式事务入门 事务必须具有的四个特性分别是:原子性(atomicity).一致性(consistency).隔离性(isolation,又称独立性)以及持久性(durability).这就是事 ...

  2. 手写基于Spring Cloud的TCC分布式事务框架

    如何简单实现TCC分布式事务框架 最近听到很多其他公司的小伙伴谈分布式事务的问题,各种业务场景都有,可能就是这两年很多公司都在往微服务发展,现在各个子系统都拆分.建设的差不多了,实现了模块化开发,但是 ...

  3. 老板现在喊我大哥,原因是我用阿里分布式事务框架Seata解决了长久以来困扰公司的分布式事务问题

    大家好,我是曹尼玛 从大学毕业5年,一直努力学习,努力工作,追求新技术,不保守. 上个月我来到一家新公司上班,月薪20K,这家公司老板人很好,对员工很关爱,公司氛围不错,同事们也努力把公司项目搞搞好. ...

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

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

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

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

  6. 分布式事务框架lcn入门demo

    文章目录 简介 实现原理 入门demo 简介 LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果. LCN5.0.2有3种模式,分别是LCN模式,TCC模式,TX ...

  7. 阿里分布式事务框架Seata,AT模式原理解析

    什么是分布式事务 如今在分布式技术盛行下,许多公司都已经在使用分布式技术了,虽然分布式技术给我们项目带来了三高(高可用,高扩展,高性能)等优点,但是缺点也很明显,分布式项目一般都是分服务开发,且多个服 ...

  8. 分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ

    分布式事务--分布式事务简介.分布式事务框架 Seata(AT模式.Tcc模式.Tcc Vs AT).分布式事务--MQ 一.分布式事务简介 如果不是分布式环境的话一般不会接触到这种,一旦是微服务这种 ...

  9. 阿里分布式事务框架Seata集成详情

    大家好,我是曹尼玛 从大学毕业5年,一直努力学习,努力工作,追求新技术,不保守. 上个月我来到一家新公司上班,月薪20K,这家公司老板人很好,对员工很关爱,公司氛围不错,同事们也努力把公司项目搞搞好. ...

最新文章

  1. oracle top用法
  2. Java开发面试题,Spring面试题整理(1)
  3. 常见架构TLB miss处理方法(转)
  4. oracle如何导出和导入数据库/表
  5. Oracle笔记 三、function 、select
  6. mysql列连接_连接来自MySQL中不同表的列
  7. 201312-5 I’m stuck!
  8. centos php memcache扩展,linux centos 安装php的memcache扩展
  9. day43,使用朋友pyMySQL连接数据库
  10. 2021高考技能考试成绩查询,2021年临床技能考试成绩出来了!附查询方式
  11. jquery 图像滑块_jQuery CSS图像滑块–自行编写代码
  12. [codeVS1917] 深海机器人问题(费用流,拆边)
  13. 如何使用工具切换设备ip 电脑和手机怎么如何换ip?
  14. 网易新闻 鸿蒙,网易新闻鸿蒙版下载-网易新闻 鸿蒙版v78.5-PC6鸿蒙网
  15. Python使用 opencv对CT图进行医学处理
  16. 计算机体系结构 第三章 CPU性能公式 CPI相关计算
  17. 自动设置为兼容模式html,什么是兼容模式?
  18. SPSSAU入门---浅谈问卷设计到数据分析之间的联系
  19. JavaScript 数字转成大写“零壹贰叁肆伍陆柒捌玖”的方法
  20. Google点击没有反应怎么办?Google卸载不了怎么办?Google安装不了怎么办?

热门文章

  1. 3.汇编指令:【字节扩展到字 CBW】、【字扩展到双字CWD】
  2. 【html】对于px、em、rem的理解
  3. Sql Server 数据库压缩备份
  4. 展现计算机学院合唱的口号,合唱口号大全
  5. python的取整和取余_python实现取余操作的简单实例
  6. PyTorch 源码解读之 nn.Module:核心网络模块接口详解
  7. php 如何取整,解析php取整的几种方式
  8. centos 配置DNS服务器地址
  9. 微信小程序 下拉刷新/上拉加载更多 (上拉加载更多怎么实现)
  10. 前端开发人员换新机需安装东西整理