期望消失时,恐惧就产生。
——格拉西安
大纲
案例介绍
1.业务分析
模拟电商网站购物场景中的【下单】和【支付】业务
(1)下单
用户请求订单系统下单
订单系统通过RPC调用订单服务下单
订单服务调用调用库存服务,扣减库存
订单服务调用优惠券服务,扣减优惠券
订单支付完成后确认订单
(2)支付
用户请求支付系统
支付系统调用第三方支付平台API进行发起支付流程
用户通过第三方支付平台支付成功后,第三方支付平台回调通知支付系统
支付系统调用订单服务确认订单
问题分析
1.分布式系统宕机问题
整个系统是分布式部署,有订单系统、商品系统、会员系统。三个系统通过RPC调用完成整个下单流程。RPC调用会导致下单中各系统耦合在一起,假如会员系统宕机,会导致下单流程的不可用。
如何异步解耦:
利用RocketMQ,订单系统在下单后,作为生产者把“下单消息”写入MQ,商品系统与会员系统作为消费者消费MQ中的“下单消息”。这样可以达到异步解耦的目的,只要订单系统正常,对于用户来说下单业务都可以正常进行。
2.数据完整性问题
用户提交订单后,扣减库存成功、扣减优惠券成功,但是在确认订单操作失败(比如:支付失败),那么就需要对库存、优惠券进行回退。
如何保证数据的完整性?
在收到确认订单失败通知后,向MQ发送“确认失败消息”
商品系统与会员系统作为消费者监听“确认失败消息”,进行对应业务的回退。
3.无效订单、同行攻击!
用户通过第三方支付平台(支付宝、微信)支付,假如下了订单,过了很久还没支付,那么这个订单应该取消,所以这个地方涉及到限时订单场景,系统在15分钟之内没有支付成功,则需要取消订单,同时回退库存与优惠券
4.秒杀、抢购高峰流程冲击
项目代码介绍
1.项目工程
2.数据库
(1)订单表
(2)商品表
(3)用户表
(4)优惠券表
3.框架及技术
整体项目使用SpringBoot搭建,整合了Mybatis,Maven依赖如下:
SpringBoot整合RocketMQ,同时使用gson作为MQ发送和消费的序列工具
另外使用mybaits-gengerator逆向工程针对数据表生成CURD持久层代码
链接: https://pan.baidu.com/s/1gCOLPI76hu1IJwLJnVOdfg 提取码: rc2r
我是娆疆_蚩梦,让坚持成为一种习惯,感谢各位大佬的:点赞、收藏和评论,我们下期见!
下一篇:RocketMQ实战(下)