首届人工智能摄影奖揭晓,读完获奖作品,我两次惊慌
06-21
1.什么是事件驱动架构?事件驱动架构是一种促进生产的软件架构范式。事件驱动架构在使用微服务构建的现代应用程序中非常常见,它使用事件来触发和解耦服务之间的通信。
事件可以是状态的变化,例如将商品放入购物车;它也可以是某个标识符,例如订单的发货通知。 eda.drawio.png 在传统的软件架构中,应用程序逻辑是由请求和进程驱动的。
请求执行一段逻辑并同步返回响应。在业务逻辑中,要执行的代码是按照流程的顺序排列的。
在事件驱动架构中,事件消费者将以异步方式处理事件生产者生成的事件。将原有流程中的逻辑交给事件消费者,解耦服务之间的耦合,聚焦应用逻辑。
职责单一,代码更加简洁,系统的响应能力也能得到提高。 2.分布式事务的事件驱动架构2019年,本文作者开源了Go语言的分布式事务框架Seata-Golang。
Seata-Golang实现了AT模式和TCC模式,这两种模式都是流程驱动的。 2018年,随着对云原生技术有了更深入的了解,我受到Kubernetes Control-Loop思想的启发,设计了一个新的高性能、非侵入式、事件驱动的Go语言分布式事务框架hptx,该框架还支持跨语言分布式事务。
、读写分离、数据库和表Mesh解决方案DBPack。两种产品都可以解决分布式事务问题,前者仅支持Go语言,后者支持任何编程语言。
它们使用相同的事件驱动架构。下面提供详细解释。
流程驱动 eda-Page-2.drawio.png 在Seata的设计中,事务发起者发起全局提交后,首先会判断该事务是否允许异步提交。如果允许,则直接返回提交成功,然后AsyncCommittingSessionManager会异步通知各个分支事务提交,AT事务默认允许异步提交。
如果不允许异步提交,则事务协调者会依次通知全局事务参与者每个分支事务已提交。所有分支事务提交成功后,全局事务提交的结果会同步返回给事务发起者,如上图所示。
事务协调器通知事务参与者提交过程中发生异常,并将全局事务标记为CommitRetrying状态。会有一个RetryCommittingSessionManager定期从持久存储中检索标记的全局事务以重试提交。
全局回滚的流程与上图类似。全局回滚时,AT模式和TCC模式同步执行,依次通知各分支事务回滚,然后将回滚结果响应给事务发起者。
如果回滚失败,全局事务会被标记为RollbackRetrying,RetryRollbackingSessionManager会定期检索被标记的全局事务数据来重试回滚。 image-5.pngSeata-Golang用户经常会问一个问题,如何让事务协调器TC Server高可用? Seata,包括Seata-Golang,默认建议使用Mysql数据库作为TC状态数据的持久存储。
TC Server本身是一个无状态应用,可以部署多副本,但是这里有一个问题:多个对等副本中的AsyncCommittingSessionManager、RetryCommittingSessionManager、RetryRollbackingSessionManager会从数据库中取出对应的数据执行,从而导致事务提交。回滚会重复执行。
虽然AT模式天生幂等,TCC模式也由用户保证幂等,但总存在一定的资源浪费,而且不够优雅。事件驱动 image-1.png 上图展示了hptx和dbpack的事务协调逻辑。
事务发起方AggregationSvc发起全局事务提交和回滚,仅修改ETCD中的数据状态,然后立即返回。订单服务和商品服务使用前缀 bs/${appid} 来观看 ETCD 中存储的分支交易数据。
当分支交易的数据发生变化时,ETCD立即推送变更事件到对应的服务,订单服务和产品服务接收到。更改事件发生后,将数据添加到工作队列中以执行提交或回滚逻辑。
AggregationSvc在提交和回滚时不会调用OrderSvc和ProductSvc的接口。整个流程通过ETCD解耦,异步执行。
eda-Page-3.drawio.png 事务分支提交或回滚失败后,会重新进入工作队列继续消费,直到提交、回滚成功或回滚超时(AT模式回滚操作涉及释放全局锁,需要设置超时时间,即retry_dead_threshold)。image-6.png 在此架构中,没有集中式事务协调器 TC Server。
用户只需要关心自己应用的高可用即可。如果部署多副本,hptx和dbpack会通过etcd选择master,并且只会选择master。
只有副本才能观看自己生成的分支事务数据进行提交和回滚,避免了重复执行提交和回滚逻辑的问题。集成hptx只需要依赖相应的SDK,不需要部署额外的TC Server。
但状态数据的存储由原来的Mysql改为ETCD。 3、新架构带来的好处:全新的云原生、事件驱动架构更加简洁,性能更强。
使用hptx的应用程序事务协调性能相比Seata-Golang提升了一倍,通过dbpack进行mesh模式的分布式事务协调性能相比Seata-golang提升了50%。以下是一些测试数据: 环境性能 Seata-golang Mac book pro 18.54 笔每秒 hptx Mac book pro 38.89 笔每秒 dbpack Mac book pro 28.09 笔每秒 hptx 阿里云 ecs ecs.sn1ne.xlarge (4 核 8G) 35.15 笔每秒hptx是目前最强大的云原生、非侵入式分布式事务解决方案。
选择其他基于内存的存储组件理论上可以实现更高的性能,但从整体可靠性和性能来看,etcd 是目前最好的选择。 4.结论通过在分布式事务领域的不断研究和总结,分布式事务框架不断演进,从最初兼容java Seata的seata-golang v1版本到云原生、非侵入式、基于grpc的seata - 从golang v2版本,到基于ETCD watch机制的事件驱动的hptx,再到跨语言的dbpack,分布式事务不断进化,能力进一步增强。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-21
06-17
06-18
06-17
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用