Seata 分布式事务框架
一、Seata (Simple Extensible Autonomous Transaction Architecture | 简单、易扩展的自治事务框架)
三、啥玩意:分布式事务的解决方案,通过提供多种模式来覆盖不同的用户场景。简单易用,但就是出了问题就麻烦咯
四、理论依据:二阶段提交的演变
五、重要理念:
- 二阶段提交协议
- 全局锁和本地锁(隔离性问题,主要为了避免分布式事务产生脏数据)
- 写隔离和读隔离,不同级别的一致性要求;一般数据敏感的要求到写隔离,比较不敏感的数据可以只要求写隔离
六、不同的事务模式
1、AT:与一般两段提交协议的差异处,在提交本地事务的时候释放资源(优点),并采用并行异步机制优化速度,全局锁机制保证数据隔离性和一致性
- 全局锁保证数据的一致性和写隔离
- 通过及时释放连接资源来提高性能,这点是相对LCN而言。
2、TCC:一般用于不支持ACID的非关系型数据库,Try Confirm Cancel三个步骤都自行定义
- cancel 空回滚,用于处理try实际未执行成功,调用了cancel的情况 - 本地事务表(通过在不同阶段插入不同状态的本地事务表记录,控制是否回滚,是否已处理,是否多次处理)
- cancel 幂等,多次执行结果一致(多次cancel) - 本地事务表
- cancel 悬挂,cancel执行在try之前(try成功执行)- 本地事务表
3、SAGA:一阶段无锁;基于事件驱动,参与者可异步执行,高吞吐。就是太麻烦,要写一堆
4、XA:基于与AT一致,只是需要支持XA分布式事务的数据库才可以(mysql应该是5.0之后开始支持XA事务)
七、示例Demo (懒得弄,直接在原来lcn的项目弄一个新分支;我这边故意把seata server启动端口改了,看eureka是否能自动追踪到,因为默认都是从本地端口获取,这个说明你都还不知道从哪里可以配置。。。我是大概跟了源码有个地方用到了vgroup.mapping,就随手改了,说实话我也还没拎清,后面彻底搞懂了再调整吧)
- server下载地址:
http://seata.io/zh-cn/blog/download.html
- 关键配置:registry.conf、file.conf
- server需要执行的脚本(客户端tm和rm的也都在这里下载,at模式也需要一个表),上面有比如mysql对应需要执行的脚本,mysql是自己在上面文件中配置的,地址:
https://github.com/seata/seata/tree/1.2.0/script
- 客户端也可以配置:registry.conf、file.conf
八、性能问题,老话题:CAP。seata有多种应用模式,相应的也是在这C和A之间取平衡,简单易用侵入性低的AT模式,自然A会弱点(性能上面差些);TCC这种及时释放资源,且没有引入全局锁机制的,自然会快些,但是要自己写很多业务逻辑(当然有些公司的业务比较简单,但是用户量并发高,那也是可以使用的)