目录
一、什么是Seata?
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。
2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。
1.演进历史
TXC:Taobao Transaction Constructor,阿里巴巴中间件团队自 2014年起启动该项目,以满足应用程序架构从单一服务变为微服务所导致的分布式事务问题。
GTS:Global Transaction Service,2016 年 TXC 作为阿里中间件的产品,更名为 GTS 发布。
FESCAR:2019 年开始基于 TXC/GTS 开源 FESCAR。
后更名为Seata
全局事务服务 GTS:https://www.aliyun.com/aliware/txc (已支持seata平滑迁移)
seata官网:http://seata.io/zh-cn/index.html
seata gitHub:https://github.com/seata/seata
2.特色功能
3.我们为什么引入seata?
- 业务发展壮大,一些复杂场景下的分布式事务的一致性问题难以解决
- 除了功能上的好处,其发展时间之久和活跃的社区也是稳定的保障之一
4.事务理论基础回顾
a) 本地事务
事务需要满足四大特性:ACID(原子性、一致性、隔离性、持久性),仅限于对单一数据库资源的访问控制。
- 原子性(Atomicity):指事务作为整体来执行,要么全部执行,要么全部不执行。
- 一致性(Consistency):指事务应确保数据从一个一致的状态转变为另一个一致状态。
- 隔离性(Isolation):指多个事务并发时,一个事务的执行不应影响其它事务的执行。
- 持久性(Durability):指已提交的事务修改数据会被持久保存。
b) 柔性事务
基于 BASE 事务要素的事务称为柔性事务。BASE 是基本可用、柔性状态和最终一致性这三个特性的缩写。
- 基本可用(Basically Available):允许分布式事务参与方不一定要同时在线。
- 柔性状态(Soft state):则允许系统状态更新有一定的延时。
- 最终一致性(Eventually consistent):通常是通过消息传递的方式保证系统的 最终一致性。
在 ACID 事务中对隔离性的要求很高,在事务执行过程中,必须将所有的资源锁定。而柔性事务的理念则是通过业务逻辑将互斥锁操作从资源层面移至业务层面。通过放宽对 强一致性 的要求,来换取系统吞吐量的提升。
5.分布式事务模式
分布式事务模式 | 简要说明 |
---|---|
AT 模式 | 无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本(sql都由框架托管统一执行,会存在脏写问题) |
TCC 模式 | 高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景;对代码侵入严重;(第一阶段会产生行锁,事务执行太久会锁行很久) |
Saga 模式 | 长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统(第一阶段就操作DB,会存在脏读问题) |
XA模式 | 分布式强一致性的解决方案,但性能低而使用较少。 |
Saga和TCC模式区别不大,TCC就是多了个锁行的步骤(避免了脏读,但事务太长会锁行很久)
二、微服务架构中的事务问题
1、单体应用
数据库本地事务来保证数据一致性
2、分布式应用
无法满足事务特性
三、Seata如何解决分布式事务问题?
1、seata的分布式事务
是由一批分支事务组成的全局事务,通常分支事务只是本地事务。
2、三大基本组件
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
3、Seata 管理分布式事务的典型生命周期
- TM 要求 TC 开始新的全局事务,TC 生成表示全局事务的 XID。
- XID 通过微服务的调用链传播。
- RM将本地事务注册为XID到TC的相应全局事务的分支。
- TM 要求 TC 提交或回滚 XID 的相应全局事务。
- TC 驱动 XID 的相应全局事务下的所有分支事务,完成分支提交或回滚。
四、总结
1、Seata实现的2PC与传统2PC的差别
架构层次方面:
传统2PC方案的RM实际上是在数据库层,RM本质上就是数据库自身,通过XA协议实现,而Seata的RM是以jar包的形式作为中间件层部署在应用程序的这一侧的。
两阶段提交方面:
传统2PC无论第二阶段的决议是commit还是rollbcak,事务性资源的锁都要保持到Phase2完成才释放。而Seata的做法是在Phase1就将本地事务提交,这样就可以省去Phase2持锁的时间,整体提高效率。
2、推荐使用Seata
传统2PC(基于数据库 XA协议)和Seata实现 2PC的两种 2PC方案,由于Seata的0侵入性并且解决了传统 2PC长期锁资源的问题,所以推荐采用 Seata实现2PC。
Seata实现2PC要点:
【1】全局事务开始使用 @GlobalTransactional 标识;
【2】每个本地事务方案仍然使用 @Transactional 标识;
【3】每个业务数据都需要创建 undo_log 表,此表是 seata保证本地事务一致性的关键;
另:seata 是可以对多个数据源进行事务控制的,前提是一个分支事务操作一个数据源;
Seata常见问题:http://seata.io/zh-cn/docs/overview/faq.html