11.本地事务和分布式事务
在以往的单体应用中,我们多个业务操作使用同一条连接操作不同的数据表,一旦有异常,我们可以很容易的整体回滚
事务是4大特性:ACID
事务的4大隔离级别:读未提交,读已提交,可重复读,串行化
spring事务的7大传播行为:
spring事务可能失效的原因:参考博客:Spring事务失效原因以及解决方案_handsomeyxl的博客-CSDN博客_spring事务失效原因及解决方案
分布式事务Seate
分布式系统经常出现的异常:机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠的 TCP、存储数据丢失..
Seate控制分布式事务的流程:
-
每一个微服务都必须创建一张undo_log的表,用于自动回滚操作
-
安装事务协调器:seata-server:https://guthub.com/seate/seate/releases seata-server.bat运行
-
整合springboot 导入依赖spring-cloud-starter-alibaba-seata
-
所有使用到分布式事务的微服务使用seata DataSourceProxy代理自己的数据源
-
配置seate的注册中心和配置中心,配置中心主要是config.txt
seata:application-id: ${spring.application.name}enable-auto-data-source-proxy: false #是否开启数据源自动代理,默认为true#(1)事务群组(可以每个应用独立取名,也可以使用相同的名字),#要与服务端nacos-config.txt中service.vgroupMapping.my_test_tx_group=default,并且要保证多个群组情况下后缀名要保持一致-tx_group
# service:
# vgroup-mapping:
# my_test_tx_group: default# (2)seata配置中心config:type: nacosnacos:namespace: 8570e815-7e0b-47de-bd79-7f89459da3e5 #nacos命名空间IDserverAddr: 127.0.0.1:8848 #nacos服务的地址group: SEATA_GROUP #seata分组名称username: "nacos" #nacos服务登录名称password: "nacos" #nacos服务登录密码# (3)seata的注册中心registry: #registry根据seata服务端的registry配置type: nacosnacos:application: seata-server #配置自己的seata服务server-addr: 127.0.0.1:8848 #nacos服务的地址group: SEATA_GROUP #seata分组名称namespace: 8570e815-7e0b-47de-bd79-7f89459da3e5 #nacos命名空间IDusername: "nacos" #nacos服务登录名称password: "nacos" #nacos服务登录密码
-
加上@GlobalTransactional注解
-
启动测试
12.RabbitMQ项目中怎么使用的
解锁库存和定时关单
1)那说一下消息丢失是怎么解决的?
大致分为3个阶段:
生产者发送消息给mq消息丢失:开启事务(同步效率低)或者开启confirm机制(异步效率高)
mq自己内部出现了问题:开启持久化机制
消费者处理消息时丢失:取消自动Ack模式,开启手动Ack模式
2)说一下消息积压怎么解决的吧?
现在生产者发送的流量
多增加几台消费者实例进行消费
将消息保存到数据库,离线慢慢处理
3)消息重复消费怎么解决?
保证业务接口的幂等性
使用防重表,发送的每一个消息都有唯一标识,处理过了就不用处理了,比如redis,
可以配合set nx命令保存消息id,保存如果key已经存在,获取它的值(比如成功是1,正在执行是0),如果是1表示已经成功处理,直接ack,如果是0就什么都不做,为了防止死锁,加一个key的过期时间
13.定时任务
使用定时任务上架秒杀商品
1)cron表达式,大家可以去官网学习:Cron Trigger Tutorial
网上都有cron表达式生成器:在线Cron表达式生成器
2)和springboot整合:
spring中也有定时任务功能,注解使用:@EnableScheduling @Scheduled
但是和它的cron表达式有点区别:
-
spring中6位组成,不允许有第七位的年
-
1-7代表周一到周日
-
第四位和第六位任意一个*和一个?
-
定时任务不应该阻塞,默认是阻塞的
-
可以让业务以异步的方式允许
-
支持定时任务线程池
-
让定时任务以异步的方式允许,加上@EnableAsync注解
-
14.秒杀功能
限流+异步+缓存+独立部署
限流方式:
1)前端限流,抢购的时候可以设置一个验证码,通过手速快慢可以降低一些请求,还有一个好处就是可以识别是人还是机器
2)nginx限流,直接将部分请求负载到错误的静态页面
3)网关限流
4)分布式信号量(本项目使用的这个)
5)rabbitmq限流
秒杀思路
1)项目独立部署,独立秒杀模块gulimall-seckill
2)使用定时任务每天三点上架最新秒杀商品,削减高峰期压力
3)秒杀链接加密,为秒杀商品添加唯一商品随机码,在开始秒杀时才暴露接口
4)库存预热,先从数据库中扣除一部分库存以redisson信号量的形式存储在redis中
5)队列削峰,秒杀成功后立即返回,然后以发送消息的形式创建订单