谷粒商城收获记录2
1、分布式事务
单体服务中服务都在一个系统中,ACID好保证,但是分布式的系统中分为多个服务,每个服务的数据库也不同,这就造成了分布式事务问题。
传统代码中的注解已经不能满足情况
@Transactional
方法名称
使用此注解时操作本地事务小心事务失效问题!
比如在多线程失效、事务的抛出异常默认是runtime等等
seata解决办法
seata介绍
-
seata支持 AT、TCC、SAGA 和 XA 事务模式;
-
分布式事务处理过程的一ID+三组件模型,一ID即Transaction ID XID,全局唯一的事务ID。
TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 定义全局事务的范围:开始全局事务、提交或回滚全局事务。 RM (Resource Manager) - 资源管理器 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
seata AT模型使用
1、seata服务端安装
-
下载地址:官网找的下载地址
-
配置seata服务端(我的是zip包,1.4.2)
配置registry.conf,有两部分,一部分是注册中心配置,一部分是配置中心,默认是file我采用的是nacos当作注册中心和配置中心
配置file.conf
准备数据初始sql
初始化sql在安装目录中conf/README-zh.md有记录
包括了server端sql和client端sql,分别下载下来,其中server端的sql在刚才file.conf配置的数据库执行,client端的sql将要和本身业务数据库放在一起
2、客户端使用
参考官网例子地址:https://github.com/seata/seata-samples
使用过程中只需要配置好tx-service-group
这个必须和seata服务端的config配置的service.vgroupMapping.my_test_tx_group=default,一致,我的配置的是“my_test_tx_group”
业务代码中application中的配置:
seata服务端的配置
@GlobalTransactional //加在原来@Transactional位置上
service业务方法
需要注意问题
- 我使用官网案例时,总是启动不成功,nacos根本注册不上,一开始我以为是seata没配好,后来发现是我的nacos问题,我本机nacos安装的是1.3,但是官网例子是nacos是2.0,我后来又装了下nacos2.x才成功注册上
- 另一个疑惑是,本人不清楚业务端的seata是从哪找的,我把项目中resources下的registry.conf都删除了,还是能正常使用seata,这是我比较奇怪的,目前我的配置信息如下图
消息队列解决办法
上述方式解决事务可用,但是高并发时候吞吐量会降低,所以采用了另一种解决策略,就是柔性事务,最大努力通知,以订单和库存为例
订单先创建,然后减库存,虽然不能同时保证订单创建完毕,就能扣除库存成功,但是可以保证库存肯定能扣减成功,保证了最终一致性。
采用消息队列方式进行分布式事务的处理
RocketMq有一种事务消息模式,也就是半消息,订单创建之前,可以发送事务消息,就是一条半消息,然后执行本地库的更新,成功之后,会将半消息状态修改,这时候这条消息就能被订单消费了,之后订单减库存。