一、什么是事件驱动架构事件驱动架构是一种促进生产的软件架构范式。事件驱动架构在使用微服务构建的现代应用程序中非常常见,这些应用程序使用事件来触发和解耦服务之间的通信。事件可以是状态更改,例如将商品添加到购物车,也可以是某种标识,例如订单的发货通知。在传统的软件架构中,应用程序逻辑是由请求和进程驱动的。请求执行一段逻辑并同步返回响应。在业务逻辑中,要执行的代码是按照流程的先后顺序排列的。在事件驱动架构中,事件消费者会以异步的方式处理事件生产者产生的事件,将原流程中的逻辑交给事件消费者处理,从而解耦服务之间的耦合并关注应用程序的逻辑。职责单一,代码更简洁,也可以提高系统的响应能力。2.分布式事务的事件驱动架构2020年,本文作者开源了Go语言的分布式事务框架Seata-Golang。Seata-Golang实现了AT模式和TCC模式,都是流程驱动的。到2022年,随着对云原生技术的深入理解,受KubernetesControl-Loop思想启发,设计了一个全新的高性能、非侵入式、事件驱动的Go语言分布式事务框架hptx,它支持跨语言分布式事务。Mesh解决方案DBPack用于事务,读写分离,分库分表。两款产品都可以解决分布式事务问题,前者只支持Go语言,后者支持任何编程语言。他们采用相同的事件驱动架构。下面将进行详细描述。流程驱动在Seata的设计中,事务发起者发起全局提交后,会先判断事务是否允许异步提交,如果允许则直接返回提交成功,然后AsyncCommittingSessionManager会异步通知各个分支在事务提交中,AT事务默认允许异步提交。如果不允许异步提交,事务协调器会依次通知全局事务参与者各个分支事务提交,所有分支事务提交成功后,同步将全局事务提交的结果返回给事务发起者,如图在上图中。事务协调器通知事务参与者在提交过程中发生异常,并将全局事务标记为CommitRetrying状态,并且会有一个RetryCommittingSessionManager定期从持久存储中检索标记的全局事务以重试提交。全局回滚的过程与上图类似。全局回滚时,AT模式和TCC模式都是同步执行的,依次通知各个分支回滚事务,然后将回滚结果响应给事务发起方。如果回滚失败,全局事务将被标记为RollbackRetrying,RetryRollbackingSessionManager将定期检索标记的全局事务数据并重试回滚。Seata-Golang用户经常会问一个问题,事务协调器TCServer是如何做到高可用的?Seata,包括Seata-Golang,默认推荐使用Mysql数据库作为TC状态数据的持久化存储。TCServer本身是一个无状态的应用,可以部署多副本,但是这里有一个问题:AsyncCommittingSessionManager、RetryCommittingSessionManager、RetryRollbackingSessionManager在多个点对点副本中会从数据库中取出对应的数据执行,这会导致事务失败Commit和rollback重复执行。虽然AT模式天生幂等,TCC模式由用户保证是幂等的,但总有一定的资源浪费,不够优雅。事件驱动上图展示了hptx和dbpack的事务协调逻辑。事务发起者AggregationSvc发起全局事务提交和回滚,只修改ETCD中的数据状态,然后立即返回。订单服务和商品服务使用前缀bs/${appid}观看存储在ETCD中的分支交易数据,当分支交易数据发生变化时,ETCD立即向对应的服务推送一个变化事件,订单服务和商品服务接收到变化后事件,将数据添加到工作队列以执行提交或回滚逻辑。AggregationSvc在提交和回滚时不会调用OrderSvc和ProductSvc的接口。整个过程通过ETCD解耦,异步执行。事务分支提交或回滚失败后,会重新进入工作队列继续消费,直到提交、回滚成功或回滚超时(AT模式回滚操作涉及释放全局锁,以及需要设置超时时间,即retry_dead_threshold)。在这个架构中,没有中心化的事务协调器TCServer,用户只需要关心自己应用的高可用。如果应用是多副本部署,hptx和dbpack会通过etcd选主。只有被选为master的副本才能观看自己产生Commit和rollback分支事务数据,避免commit和rollback逻辑重复执行的问题。集成hptx只需要依赖相应的sdk,无需额外部署TCServer,只是状态数据的存储由原来的Mysql改为ETCD。3.新架构带来的好处全新的云原生事件驱动架构更简洁,性能更强。使用hptx进行应用事务协调性能较Seata-Golang提升一倍,通过dbpack进行mesh模式分布式事务协调性能较seata-golang提升50%。以下是部分测试数据:环境性能seata-golang2018Macbookpro18.54transactionspersecondhptx2018Macbookpro38.89transactionsperseconddbpack2018Macbookpro28.09transactionspersecondhptxAlibabaCloudecsecs.sn1ne.xlarge(4cores8G)每秒35.15笔交易hptx是目前最强大的云原生、非侵入式分布式交易解决方案。选择其他基于内存的存储组件理论上可以获得更高的性能,但综合可靠性和性能,etcd是目前最好的选择。4.结语经过在分布式事务领域的不断研究和总结,分布式事务框架不断演进,从最初兼容javaseata的seata-golangv1版本到云原生、非侵入式、基于grpc的seata-golang从golangv2版本,到基于ETCDwatch机制的事件驱动的hptx,再到跨语言的dbpack,分布式事务不断进化,能力进一步增强。
