【万字原创】 从0~1实现 微服务下 下单/秒杀场景最终一致性解决方案(rocketmq):完整流程,模型,讲解,压测,部署介绍以及完整demo源码和源码说明(1)

您所在的位置:网站首页 苹果电脑账户密码忘了 【万字原创】 从0~1实现 微服务下 下单/秒杀场景最终一致性解决方案(rocketmq):完整流程,模型,讲解,压测,部署介绍以及完整demo源码和源码说明(1)

【万字原创】 从0~1实现 微服务下 下单/秒杀场景最终一致性解决方案(rocketmq):完整流程,模型,讲解,压测,部署介绍以及完整demo源码和源码说明(1)

2023-01-28 18:33| 来源: 网络整理| 查看: 265

【万字原创】从0~1实现 微服务下 下单/秒杀场景最终一致性解决方案(rocketmq):完整流程,模型,讲解,压测,部署介绍以及完整demo源码和源码说明(1)-整体介绍【万字原创】从0~1实现 微服务下 下单/秒杀场景最终一致性解决方案:流程,模型,讲解,压测,部署以及完整demo源码(2)-goods+order服务完整源码 概述

本文主要是对高并发下异步降波峰的场景的一种模拟,由于微服务下,数据库和个业务代码都是分离的,所以即使用到了mq,依然存在数据一致性以及feign/rpc的调用问题,本文是基于源码的minicloud 微服务框架下开发的demo,主要是提供微服务下最终一致性的一种解决方案,不要纠结与代码,主要是看思路

为什么要使用最终一致性解决方案

最终一致性方案说白了就是异步方案,后台延时异步处理一些业务,这样做的好处是降低了同步处理进行的业务处理阻塞, 高并发下同步处理是很容易对thread,io,db 造成阻塞的,虽然好处是实时的相应处理结果,但一般实际业务上,用户是允许先迅速得到一个反馈,比如xxx完成,正常处理中。。。,然后几秒到十几秒甚至是更久的给一个明确结果的

单体服务下与微服务下最终一致性解决方案有哪些不同 单体服务下:

由于所有业务都在一个服务内开发,数据库也不太涉及分库问题(数据切割跨库例外), 所以开发起来可以直接将业务划分为发送->mq消费即可,mq消费端其实也是集成如单体服务中的,好处是可以直接复用业务内的service 等业务代码,不涉及任何远程调用

微服务下:

微服务下基本上都是根据业务切割服务的,数据库也都是按业务划分的,这是优点其实也是缺点,优点是业务更清晰,更便于开发和部署,缺点是服务之间经常需要远程调用比如feign或者dubble,只要涉及到远程,就得考虑超时,挤压,数据一致性问题,这些处理起来如果是同步业务的话,高并发下是很容易造成波峰挤压的,很有可能用户调用时候会点击了一个业务比如下单,然后就一直在等待,最后可能会返回超时或者是下单失败,库存不足,这样不但,用户体验很不好,而且很容易也把系统压崩了

下单/秒杀场景中下涉及服务以及整体流程

这里是模拟了两个服务,商品服务和订单服务,库存和商品放在一个服务,下单/秒杀整体流程图如下:

在这里插入图片描述

流程时序图 详细流程时序图

在这里插入图片描述

详细流程时序图完整讲解

1. goods服务:商品服务后台管理首先初始化/维护商品数量到reids+db 2. 用户选择商品(一个或多个)和数量点击下单 3. order服务:订单服务首先根据redis(lua表达式原子性)判断+扣除商品数量 3.1 order服务:如果数量不足,则直接返回给用户下单失败,提示库存不足 3.2 order服务:如果数量足够,则创建一个订单并插入数据库,返回被用户订单创建中,并将订单信息发送到rocketmq(事务消息) 4. mq消费者服务:远程调用goods服务扣除商品数据库库存 4.1 goods服务: 查询是否有扣除记录,没有则插入扣除库存表,有则直接返回扣除成功,库存不足则返回扣除失败,提示库存不足 4.2 mq消费者服务:远程goods服务扣除成功则远程调用order服务更新订单状态为成功(只有状态是处理中的才会更新) 4.3 mq消费者服务:远程goods服务扣除失败则远程调用order服务更新订单状态为失败(只有状态是处理中的才会更新) 5. 定时任务:定时查询订单状态为创建中的订单,如果超过一定时间,则重新发送mq消息

单体服务与微服务下部署节点参考图

在这里插入图片描述

结语

本篇主要是对思路以及整体流程的介绍,后续会有完整源码以及运行,压测的完整内容



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3