一、什么是事件驱动架构

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

在传统的软件架构中,应用逻辑是通过请求、过程驱动的。一个请求执行一段逻辑同步返回一个响应,在业务逻辑中,将要执行的代码按照过程顺序进行编排。

而事件驱动架构中,事件消费者会以异步的方式处理事件生产者产生的事件,原来过程当中的逻辑交给事件消费者去处理,解开服务之间的耦合,使应用的逻辑聚焦,应用的职责单一代码更加简洁,也能提升系统的响应能力

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

在 2020 年,本文作者开源了 Go 语言的分布式事务框架 Seata-Golang。Seata-Golang 实现 AT 模式和 TCC 模式,这两种模式都是过程驱动。

到了 2022 年,随着对云原生技术的理解深入,从 Kubernetes Control-Loop 思想中获得灵感,全新设计了高性能、无侵入、事件驱动的 Go 语言分布式事务框架 hptx,以及支持跨语言分布式事务、读写分离、分库分表的 Mesh 方案 DBPack。这两款产品都能解决分布式事务问题,前者只支持 Go 语言后者支持任意编程语言。他们采用了相同的事件驱动架构。下面进行详细的说明。

过程驱动


AsyncCommittingSessionManagerCommitRetryingRetryCommittingSessionManager
RollbackRetryingRetryRollbackingSessionManager

Seata-Golang 的用户经常会问一个问题,事务协调者 TC Server 怎么做高可用?

Seata 包括 Seata-Golang 默认推荐使用 Mysql 数据库作为 TC 状态数据的持久化存储。TC Server 本身则是无状态应用,可以部署多个副本,但这里就存在一个问题:多个对等副本里的

AsyncCommittingSessionManagerRetryCommittingSessionManagerRetryRollbackingSessionManager

事件驱动

bs/${appid}workqueue
workqueueretry_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-golang2018 款 Mac book pro每秒 18.54 笔事务
hptx2018 款 Mac book pro每秒 38.89 笔事务
dbpack2018 款 Mac book pro每秒 28.09 笔事务
htpx阿里云 ecs ecs.sn1ne.xlarge (4 核 8G)每秒 35.15 笔事务

hptx 是当前性能最强的云原生、无侵入分布式事务解决方案,选择其他内存型存储组件理论上可以得到更高的性能,但综合可靠性和性能,ETCD 是目前最好的选择。

四、结语

经过持续地在分布式事务领域的研究总结,使分布式事务框架不断进化,从最初的兼容 java seata 的 seata-golang v1 版本,到云原生的、无侵入的、基于 grpc 的 seata-golang v2 版本,到基于 ETCD watch 机制的、事件驱动的 hptx,再到跨语言的 dbpack,分布式事务一直在进化,能力也在进一步增强。

欢迎感兴趣的同学加入我们社区一起交流讨论分布式事务问题、DBMesh 问题。

相关链接

Hptx 项目地址:

Hptx samples:

DBPack 项目地址:

DBPack 文档:

DBPack-samples:



想要了解Go更多内容,欢迎扫描下方 关注 公众号,回复关键词 [实战群] ,就有机会进群和我们进行交流~