一个用go实现的分布式事务框架

简介: 一个用go实现的分布式事务框架

easycar是什么


easycar 是一个用go实现的支持两阶段提交协议的分布式事务框架。目前还只支持TCC,SAGA 模式,其他模式待开发。在介绍easycar 之前,先简单介绍几个角色。


Transaction Coordinator(TC)


负责全局事务的管理,所有参与分布式事务的分支都会注册到coordinator,会给每个分布式事务分配一个唯一id,当然还包括驱动全局 begin / commit /abort(我喜欢称rollback)


Transaction Manager (TM)


有些时候也叫 Transaction Client,当然不同的实现也许都会换个名字,但是职责都大差不差。一般通过TM对每个参与的RM发起一阶段的请求,如果一阶段的RM全部成功,那么TM会向TC发起commit请求,否则发起rollback。


Resource Manager(RM)


用户维度的角色,管理本地事务处理的资源。其实你可以这么理解,假设你的订单服务部分接口参与了分布式事务,无论是第一阶段TM调用接口,还是TC第二阶段调用接口,你的订单服务都会去负责本地的事务修改。

那么 easycar 上述角色有什么不同吗?有的。既然TC负责的就是全局事务的管理,那么我把职责都给了它。即由TC每个参与的RM发起一阶段的请求,然后再根据一阶段的结果,发起二阶段的请求。由TC接管整个分布式事务的生命周期。是的,我弱化了上面TM的能力。在我眼里,TM本质上就是一个客户端。客户端只需要做一些数据封装,简便化操作即可。所以即使没有客户端,其他语言的用户也可以直接通过http请求easycar服务接口。所以理论上,大部分模式下,不需要客户端也是可以直接使用easycar服务的。


支持协议和事务模式同时混用


参与分布式事务的服务往往由不同的多个部门维护,或者部分新老项目交错,可能无法保证服务的协议是一致的。另外,不同的服务所采用的事务模式具体是由:业务场景以及构造的成本来决定的。所以参与分布式事务之间所使用的事务模式不一定是统一的。在这些基础上,easycar支持协议混用(目前支持http和原生的grpc服务),支持部分事务模式混用(目前支持TCC,Saga)。


支持并发执行


假如现在有 order,account以及stock三个服务。由这三个服务组成一个分布式事务。当用户下单时,需要经过这三个服务中内部一些接口(account 扣钱,stock减库存,order 创建订单)。如果只是同步执行第一阶段,那么第一阶段总执行时间= (account+stock+order)。很多场景下,分布式事务之间并不会存在执行依赖先后的关系。所以多个子事务一阶段可以同时并发执行。流程就像这样


1668517036317.jpg


上图我们需要保证创建订单前必须先执行account扣减余额和stock扣减库存服务,才能创建订单order的服务。同时account和stock服务并不需要保证他们的执行顺序。那么我们一阶段总执行耗时可以粗略=max(account,stock)+order。因此,easycar是支持分层并发执行的。对参与的RM通过设置的权重做分层,同一层的RM可以并发调用,一层处理完毕再接下一层。在这个基础上,当某个RM发生调用错误时,那么后面一层也不会执行了,整个分布式事务需要回滚。


异常处理


分布式事务中会出现一些问题,比如

  • 空补 Cancel请求到来时,Try还没有执行,这时候这样的请求我们不能执行,理应直接返回。
  • 悬挂:Try执行时,Cancel已执行完成,不能执行,直接返回。
  • 幂等:所有操作的接口都存在这个问题。

这些问题需要用户自己去解决,框架不会自动帮你处理。在我看来,这些问题本身就是服务的必要工作,而不是通过外部服务来帮你保证换句话说,前端说它参数做了校验,难道后端就不校验接口了吗?


重试


这一块暂时还没决定最终方案。我眼中的重试有两种模式:同步和异步。同步的意思是说,当请求RM服务发生错误的时候(网络、服务本身挂了、或者服务里的中间件挂了),通过固定次数固定时间重试,这个时间通常很短,比如一秒。问题是服务挂的情况下,短时间大概率好不了,重试几乎可能是无用功。整个过程,客户端是阻塞等待的,白白耗费时间。异步重试采用指数退避算法之类的逻辑,比如第一次重试1分钟后,第二次2分钟.....,限制一个上限值,比如最多延迟一个小时还是不行的话,那只能发告警,线下处理了。这样的弊端是

  • 首先用户不能实时获取本次分布式事务结果了(正在重试中),只能等到真正执行完毕的时候通过回调的方式异步通知用户分布式事务最终结果。
  • 退避时间越长,就意味着数据不一致的时间越长。但是如果人工直接干预又存在极大的风险。比如在你人工干预的同时,正好逻辑已经开始执行了,可能会造成新的数据不一致。


状态流转图


easycar global 状态流转图


1668517064263.jpg


最后


easycar 开发不是很久,它还有好多工作需要去完成。感兴趣的可以一起加入项目地https://github.com/wuqinqiang/easycar

相关文章
|
1月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
1月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
4天前
|
存储 监控 数据可视化
常见的分布式定时任务调度框架
分布式定时任务调度框架用于在分布式系统中管理和调度定时任务,确保任务按预定时间和频率执行。其核心概念包括Job(任务)、Trigger(触发器)、Executor(执行器)和Scheduler(调度器)。这类框架应具备任务管理、任务监控、良好的可扩展性和高可用性等功能。常用的Java生态中的分布式任务调度框架有Quartz Scheduler、ElasticJob和XXL-JOB。
131 66
|
11天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
45 2
|
28天前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
1月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
68 6
|
1月前
|
数据库
如何在Seata框架中配置分布式事务的隔离级别?
总的来说,配置分布式事务的隔离级别是实现分布式事务管理的重要环节之一,需要认真对待和仔细调整,以满足业务的需求和性能要求。你还可以进一步深入研究和实践 Seata 框架的配置和使用,以更好地应对各种分布式事务场景的挑战。
38 6
|
1月前
|
消息中间件 运维 数据库
Seata框架和其他分布式事务框架有什么区别
Seata框架和其他分布式事务框架有什么区别
30 1
|
1月前
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
119 4
|
1月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
103 1