谷粒商城学习(七)

购物车:

根据是否登录,
cookie、redis、db
检查购物车,添加购物车,购物车列表

登录:

认证中心
jwt

1 点击登录按钮,在登录页面输入用户名和密码通过用户名和密码验证用户登录是否成功后,生成jwt的token返回给search.gmall.com/index,在拦截器里面将返回的token写入cookie

2 点击结算按钮,拦截器拦截请求
A该用户没有登录,并且结算请求时必须登录的,将用户打回认证中心进行登录
B该用户没有登录,并且结算请求时没有登录也可以访问,放行

3 在被拦截登录后,返回原始请求(携带登录成功后颁发的token)

4 原始请求的拦截器第二次拦截请求,拦截请求后,将返回的token写入cookie

在这里插入图片描述

支付:

在这里插入图片描述

1 用户请求谷粒商城进行支付
2 谷粒商城返回给用户一个跳转支付宝的链接(带着谷粒商城和支付宝合作的appId)
3 用户的浏览器和支付宝的服务器交互过程中安全问题
	非对称密钥加密(rsa),两个超大质数乘机的因式分解不可逆原理
	通过rsa非对称密钥生成的网络签名,可以用来验证请求发送者的身份

消息队列的应用:

------延迟队列
0 提交订单的延迟检查(支付服务)------检查支付结果
PAYMENT_CHECK_QUEUE

-----消息队列
1 支付完成(支付服务)
PAYMENT_SUCCESS_QUEUE

2 订单已支付(订单服务)
ORDER_PAY_QUEUE

3 库存锁定(库存系统)
SKU_DEDUCT_QUEUE

4 订单已出库(订单服务)
ORDER_SUCCESS_QUEUE

1、什么是事务?

保证数据的一致性:对于复杂的业务操作,由于业务的复杂性,需要完成多表的增删改查
并放在同一张元子里面同时提交和回滚,同时兼顾数据一致性,引入的就是事务。

2、什么是分布式事务?

在分布式环境下保持数据的一致性---保持事务一致性--在分布式的环境下有些业务需要并发处理,
但是不同业务对应不同的数据及结构,不同的数据和结构如何在一个业务中同时提交或回滚。
--其他的事务成功了,有一个事务没有成功进行了回滚,这样不行。---要死一起死

在这里插入图片描述

3、怎么解决分布式事务?

分布式事务存在性能问题,无法兼顾性能和效率。

基于消息队列的解决方案:
	将消息的事务和普通事务放在一起,同时提交或回滚。

折中方案:

1、XA协议下的两段式提交

	在xa协议下,提交一个事务需要经过两个阶段:预备提交-->提交   
	有一个事务协调器,保持一致性。但是性能太低
	银行系统

2、XA两段式提交的进行版:TCC、Try Confirm Cancle

	为了保证事务协调器的效率,在业务层实现TCC三个接口,入侵性太强
	Ali开发了一个GTS框架,结合了两种方式的优点:既有事务协调器,又有本地资源管理器

3、最常用的:基于**消息**的**最终一致性**策略的分布式事务(消息队列MQ),性能效率优于前两种

	在一个**事务**正在进行的同时,发出消息给其他业务
	如果消息发送失败,或者**消息的执行**失败,则回滚消息,重复执行
	反复执行失败之后,记录失败信息,后期进行补偿性行为的处理,保持事务的一致性
	事务体现在消息的执行中,在消息系统中开启事务,是一种消息的事务,保证消息被正常消费,否则回滚的一种机制

4、消息队列的中间件

消息队列,也叫消息中间件。消息的传输过程中保存消息的容器。
1 activeMq,由apache开发,基于jms的接口规则
2 RabbitMQ,c开发,基于amqp协议
3 kafka,大数据的消息中间件
4 zeroMq,基于socket协议
5 mateMq,阿里的产品

5、broker

broker相当于一个小的负载均衡分发器,在消息发送者和MQ之间作用,消息分发的实例
ActiveMQ:基于TCP协议
ActiveMQ中,消息的两种模式:
队列模式Queues相当于一对一单聊,话题模式/订阅模式Topics相当于群聊

6、MQ消息队列在项目中的作用是什么?

1、解决服务并发的问题,多个服务共同完成的业务,为了降低耦合不能将服务串联,使用MQ实现并行处理。
2、进行数据同步,manage直接修改一个数据,进行redis缓存、es的同步修改

7、分布式事务的业务模型

--------------------------------------------------延迟队列
0 提交订单的延迟检查(支付服务)------检查支付结果
PAYMENT_CHECK_QUEUE
--------------------------------------------------消息队列
1 支付完成(支付服务)
PAYHMENT_SUCCESS_QUEUE

2 订单已支付(订单服务)
ORDER_PAY_QUEUE

3 库存锁定(库存系统)
SKU_DEDUCT_QUEUE

4 订单已出库(订单服务)
ORDER_SUCCESS_QUEUE

购物车合并队列
商品管理同步队列

8、延迟队列

1、解决的问题:
	定时任务(延迟队列的)---相较于Spring的定时任务更加灵活
	
	在提交支付后,向消息队列发送一个延迟执行的消息任务,当该任务被支付服务执行时,
	在消费任务的程序中去查询当前的交易状态,根据交易状态决定解除延迟任务还是再设置新的延迟任务。
	
2、配置消息队列的延迟属性:schedulerSupport="true"

3、 检查当前订单的交易状态,根据交易状态(没有成功支付),设置重新发送延迟检查的时间和队列
	检查当前订单的交易状态,根据交易状态(成功支付),更新支付信息发送订单队列(幂等性检查)

9、幂等性

服务器资源对于相同的请求,一次或者多次,所返回的结果状态应该保持一致。
在支付时进行多次请求,如果之前已经处理过了已经支付成功,直接将处理的结果返回给你,承诺不会产生新的处理结果。
		//幂等性检查
        PaymentInfo paymentInfoParam = new PaymentInfo();
        paymentInfoParam.setOrderSn(paymentInfo.getOrderSn());
        PaymentInfo paymentInfoRes = paymentInfoMapper.selectOne(paymentInfoParam);

        if(StringUtils.isNotBlank(paymentInfoRes.getPaymentStatus()) && paymentInfoRes.getPaymentStatus().equals("已支付")){
            return;
        }else{
        //更新订单
        }      

10、库存及拆单

订单信息(订单已支付队列) --->  库存拆单  ---> 按照支付订单的商品信息进行库存锁定 --->调用其他拆单接口
  ---> 电商系统实现 拆单 ---> 调用物流系统 返回对应物流单号---> 发货

easyUI:是一个基于jQuery的用在后台管理系统中的js的UI框架。

补充:

1、后台管理,发布商品sku时,使用消息队列同步缓存

------manage-service中SkuServiceImpl----发出商品的缓存同步消息
发布一个SKU,缓存中有这个Item----在SkuService中已经有了查询数据库和同步缓存的代码、分布式锁
------发出商品的搜索引擎的同步消息

2、搜索商品时,热度值字段 HotScore

可以将热度值字段,单独地存储在redis中
在redis中专门设置一个热度值字段,对应es中的热度值,在es检索结果之后,根据商品id取出热度值,进行排序
redis没更新固定次数,同步一次es,用redis作为一个缓冲区,来稀释对es的大量写的操作

3、购物车模块时

如果用户登录,合并cookie中和db中的购物车数据,然后同步redis
在用户登录时,发出一个用户登录的消息(话题模式topic),让cartService消费,做购物车的合并和同步缓存
cartService无法清除cookie中的数据--->业务上进行解决:
在访问购物车列表时,如果当前用户已经登录,则删除cookie中多余的购物车数据

4、提交订单时

调用库存服务的库存查询接口,做库存的校验,查询除去锁定库存的剩余商品数量。

5、库存削减的队列

由订单服务消费,订单服务修改订单状态为准备出库

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值