开源的分布式事务解决方案之Seata

前言

分布式事务框架很多:tcc-transaction、Hmily、ByteTCC、myth、EasyTransaction、tx-lcn、seata等等框架,这里有一篇关于这些框架压测的测试报告【不包括seata】:测试报告 ,可以了解下
开源的分布式事务解决方案之Seata_第1张图片
这里我们介绍seata来实现分布式事务。

2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地事务的使用一样,简单和高效,并逐步解决开发者们遇到的分布式事务方面的所有难题。

Fescar 开源后,蚂蚁金服加入 Fescar 社区参与共建,并在 Fescar 0.4.0 版本中贡献了 TCC 模式。

为了打造更中立、更开放、生态更加丰富的分布式事务开源社区,经过社区核心成员的投票,大家决定对 Fescar 进行品牌升级,并更名为 Seata,意为:Simple Extensible Autonomous TransactionArchitecture,是一套一站式分布式事务解决方案。

Seata 融合了阿里巴巴和蚂蚁金服在分布式事务技术上的积累,并沉淀了新零售、云计算和新金融等场景下丰富的实践经验

seata简介

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。https://seata.io/zh-cn/
开源的分布式事务解决方案之Seata_第2张图片
解决分布式事务问题,有两个设计初衷

**对业务无侵入:**即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入 高性能:减少分布式事务解决方案所带来的性能消耗

Seata目前有三种分布式事务实现方案:AT、TCC及SAGA

  • AT模式主要关注多 DB 访问的数据一致性,当然也包括多服务下的多 DB 数据访问一致性问题2PC-改进
  • TCC 模式主要关注业务拆分,在按照业务横向扩展资源时,解决微服务间调用的一致性问题
  • Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事
    务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都
    由业务开发实现。

Seata模式说明

1)AT模式

Seata AT模式是基于XA事务演进而来的一个分布式事务中间件,XA是一个基于数据库实现的分布式事务协议,本质上和两阶段提交一样,需要数据库支持,Mysql5.6以上版本支持XA协议,其他数据库如Oracle,DB2也实现了XA接口。
开源的分布式事务解决方案之Seata_第3张图片
事务协调器Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。

事务管理器Transaction Manager(TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。

**资源管理器Resource Manager (RM):**控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
开源的分布式事务解决方案之Seata_第4张图片
Branch就是指的分布式事务中每个独立的本地局部事务[在每个服务中的事务]。

一阶段

在一阶段,Seata 会拦截“业务 SQL”,首先解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执行“业务 SQL”更新业务数据,在业务数据更新之后,再将其保存成“after image”,最后生成行锁。以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。任何提交的业务数据的更新一定有相应的回滚日志存在
开源的分布式事务解决方案之Seata_第5张图片
基于这样的机制,分支的本地事务便可以在全局事务的第一阶段提交,并马上释放本地事务锁定的资源;这也是Seata和XA事务的不同之处,两阶段提交往往对资源的锁定需要持续到第二阶段实际的提交或者回滚操作,而有了回滚日志之后,可以在第一阶段释放对资源的锁定,降低了锁范围,提高效率,即使第二阶段发生异常需要回滚,只需找对undolog中对应数据并反解析成sql来达到回滚目的。

同时Seata通过代理数据源将业务sql的执行解析成undolog来与业务数据的更新同时入库,达到了对业务无侵入的效果。

二阶段提交

二阶段如果是提交的话,因为“业务 SQL”在一阶段已经提交至数据库, 所以 Seata 框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可。
开源的分布式事务解决方案之Seata_第6张图片

二阶段回滚

二阶段如果是回滚的话,Seata 就需要回滚一阶段已经执行的“业务 SQL”,还原业务数据。回滚方式便是用“before image”还原业务数据;但在还原前要首先要校验脏写,对比“数据库当前业务数据”和“after image”,如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理。
开源的分布式事务解决方案之Seata_第7张图片
通俗讲:
上面太官方,可能很多人看不懂,在这里通俗解释下:

  1. 第一阶段:假如我们现在插入或更新一条数据,根据动态代理它会提取你插入或更新的数据,保存一个原快照,然后再去执行业务sql,再保存一个新快照,生成一个行锁,当你这个业务方法没有执行完,这个锁是不会释放的,最终提交业务sql,业务表和log表是在同一个本地事务中,也就是要么同时成功,要么同时失败,因为你更新或插入一条数据,log表会记录一些原数据,便于回滚,是seata帮助我们实现回滚
  2. 第二阶段:在这个阶段它会查看你的日志是否成功,如果成功不会做任何操作,如果失败,它会做一个反向补偿,由于log表会记录一些原数据,回滚

log表会记录一些原数据,便于回滚,是seata帮助我们实现回滚:
1):你执行了insert,回滚是将log表中的对应数据delete
2)你执行了update,回滚也就是update 业务是加,回滚就是减
log表是seata的,不是随便创建的

开源的分布式事务解决方案之Seata_第8张图片

2)TCC模式

2019 年 3 月,蚂蚁金服加入分布式事务 Seata 的社区共建中,并贡献其 TCC 模式。TCC 模式通常用于非关系型数据库的分布式事务的实现,作为AT模式的补充。可以与AT模式混合使用。

Seata也针对TCC做了适配兼容,支持TCC事务方案,原理前面已经介绍过,基本思路就是使用侵入业务上的补偿及事务管理器的协调来达到全局事务的一起提交及回滚。
开源的分布式事务解决方案之Seata_第9张图片
安装seata与搭建seata服务

你可能感兴趣的:(java,分布式)