高并发解决方案_高并发提交订单的解决方案
商城系统,根据不同的业务需求,归类出几种购买活动。比如:常规商品的购买,稀缺商品的秒杀活动,特价商品的限时优惠活动,加价换购活动,拼团活动,众筹活动,将要发行销售的预售活动。这里,针对预售活动场景,来进行细聊。
预售活动,一个商品,还未上市,提前进行预售,这是对市场需求的摸底。比如,某位歌手,要发行新的专辑,提前进行销售,根据预售的情况,进行生产,而不会造成大量库存积压。
粉丝为了自己偶像,冲击各种记录,比如几分钟销量破多少万,第一天销量多少万,而导致预售开始的前几十分钟,并发很高。
商家为了更好的刺激用户,会设置多种促销方案,比如,实时销量,用户购买排行榜,购买的用户可以解锁某个合成的海报,可以获得专辑的抽奖码等。所以,用户支付成功后,后端需要进行很多相应的处理。
根据上面的分析,预售活动,一般无需设置库存,也就不存在由于扣减库存导致的锁争夺而造成提交订单失败。
但是按照常规提交订单的流程,高并发去提交订单到一个数据库表中,这时服务器磁盘io性能瓶颈限制了mysql性能。
首先,我们可以更换服务器的硬盘为SSD,但单台的服务器性能始终有上限,那么我们可以通过扩展服务器的数量,横向扩展(理论上可以无限扩展)。
比如,有1w个用户,提交订单,1台数据库服务器性能支撑不住,那么如果我们有10台缓冲数据库服务器,一台缓冲数据库服务器只需支撑1k用户提交订单,大大减少了服务器io压力。最后在一个后台任务中把缓冲数据库中的订单同步到订单表中。
一台服务器能够支撑的并发,上限是5k,那么如果只有一台web服务器,需要支撑1w个并发请求,也是远远不够的,更何况还要处理支付成功后的几种促销方案。这时我们需要准备多几台web服务器,需要根据不断的压测,来决定web服务器的数量。
我们还需要一台总入口nginx服务器,来进行轮询访问几台web服务器。这样,其中一台web服务器的宕机,只影响一部分用户的访问。同时,还需要用一台性能差些的服务器作为入口nginx服务器的备份。
Token,身份令牌,可以让一个用户访问不同的web服务器,而用户是无感知的。而用户具体的信息,我们可以存放到redis缓存中。这样不同web服务器,拿到token的时候,都可以获取到用户id,组成一个缓存key(比如:user:session:用户id),从而去redis获取到用户的相关信息,实现session在不同web服务器间共享。
1,提交订单
(1)生成订单号。我们可以使用“年月日时分秒+流水号”,redis的incr方法实现流水号,key值为年月,这样每个月的流水号都从1开始。
(2)获取缓冲数据库的索引。比如,我们有2台缓冲服务器。订单流水号为1,那么index=1%2=1订单流水号为2,那么index=2%2=0订单流水号为3,那么index=3%2=1
(3)订单插入到对应的缓冲数据库中。我们可以只存订单号,订单数据转化为josn字符串存放到字段中,方便扩展。订单号为了方便搜索订单数据。
2,写入缓存
(1)根据用户id和订单号合成redis缓存key,比如“Mall:OrderBuffer:1:2020021312130100001”(1=用户id,2020021312130100001=订单号),把订单详情缓存key存放到缓存中。后面获取所有还没同步到订单表的缓冲订单号列表,就可以直接从redis中读取。
(2)根据订单号合成redis订单详情缓存key,比如“Mall:OrderBuffer:2020021312130100001”(2020021312130100001=订单号),把订单所有信息存放到缓存中。这样,可以根据上面两种redis缓存,读取出用户所有在缓冲表中但还没同步到订单表中的订单。
3,写入消息队列
把订单号和缓冲库的索引,推送到消息队列中,这里使用的是RabbitMQ,返回提交成功。
4,后台订阅任务
(1)订阅消息队列
(2)同步缓冲表中的订单到订单表中
(3)删除缓冲表中到订单数据
5,订单有变更,更新缓存
订单支付成功同步回调/异步回调,都需要判断,缓冲订单是否同步到订单表中,如果没有,需要更新缓冲数据库中的订单支付状态,更新redis缓存中的订单支付状态。这里需要注意:如果缓存订单在同步中,刚好支付成功回调了,要规避好边界点。
每一个技术,很难直接生产价值,只能依托于某个产品,去兑现价值。
高并发解决方案_高并发提交订单的解决方案相关推荐
- mysql高并发秒杀_高并发秒杀解决方案(转载)
今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...
- mysql并发量_高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!
推荐阅读: 学会这些微服务+Tomcat+NGINX+MySQL+Redis,再去面试阿里P7岗吧 "火爆"的微服务架构你还不会?从基础到原理的PDF文档快来学! Nginx负载均 ...
- mysql 高并发 响应时间_高并发,你真的了解吗?
摘要:本文介绍高并发系统的度量指标,讲述高并发系统的设计思路,再梳理高并发的关键技术,最后结合作者的经验做一些延伸探讨. 当前,数字化在给企业带来业务创新,推动企业高速发展的同时,也给企业的IT软件系 ...
- 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...
不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...
- 私有云 解决方案_私有云–理想的业务解决方案
私有云 解决方案 The cloud computing solutions within companies seems to be a much preferred choice by IT ma ...
- 高并发处理方案_高并发系统下的缓存解决方案
什么样的数据适合做缓存? 缓存和DB数据一致性在之前已讲过,详细可参考下面阅读推荐<如何保障mysql和redis之间的数据一致性>,我们这里讲一讲缓存穿透.缓存雪崩和击穿的三种场景解决方 ...
- 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现
在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...
- oracle rac 高并发性能_高并发业务下 JVM 涉及的垃圾回收与性能问题分析与定位...
最近好多 Java 的朋友问:"高并发业务场景下,JVM涉及的性能问题好难搞呀--".看来是大家的技术经验相对少了些,拿不准该从哪些地方上手,其实,每个技术人要该懂得怎样更好打造自 ...
- Lua mysql insert 并发数_高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql
Mysql客户端 lua-resty-mysql是为基于cosocket API的ngx_lua提供的Lua Mysql客户端,经过它能够完成Mysql的操做.默认安装OpenResty时已经自带了该 ...
最新文章
- 用ldap方式访问AD域的的错误解释
- 人工智能科学家发现 “衰老时钟”,我们的生物钟可以倒转
- Android友盟增量更新
- 文巾解题 180. 连续出现的数字
- (chap1 网络基础知识)网络的构成要素:(7)网关
- linux下不同arm 编译器的异同
- java链接mysql出问题_java连接MySQL出现问题
- php获取网页输出,PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)_PHP教程
- 一道多线程通信实例分析
- java多用户商城b2b2c源码
- Debian 决定允许无记名投票,候选人Felix Lechner质疑
- smbus使用 树莓派_Linux控制I2C/SMBus设备
- Flink 生态:Pulsar Connector 机制剖析
- 图解动软代码生成器使用(C#快捷生成代码)
- matlab取整函数记录
- 制作企业批量安装的WIN10封装镜像
- apkg格式怎么打开_PDF文件怎么压缩?这里有几个小技巧~
- IT十年人生过客-七-眉毛与恶名
- 正襟危坐说--操作系统(伍):进程间通信
- PPT和PPTX的区别是什么
热门文章
- java 图形库_OpenGL开放图形java库jogamp-all-platforms.7z
- 直方图和直条图_绘图专题 | 条形图/直方图傻傻分不清楚
- yarn资源参数配置
- Linux下修改python pip镜像源:推荐豆瓣源
- Linux echo命令:给文本着色/背景色/文本闪动
- eureka自我保护机制及配置
- 对用户密码进行md5加密的代码实现
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)
- 如何将Felgo程序部署到Android中
- stm32f302 can通讯_福特福克斯发动机无法启动,诊断电脑还通讯不了怎么修?