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)队列削峰,秒杀成功后立即返回,然后以发送消息的形式创建订单

谷粒商城面试知识点总结(三)-编程知识网

 谷粒商城面试知识点总结(三)-编程知识网