商城系统,根据不同的业务需求,归类出几种购买活动。比如:常规商品的购买,稀缺商品的秒杀活动,特价商品的限时优惠活动,加价换购活动,拼团活动,众筹活动,将要发行销售的预售活动。这里,针对预售活动场景,来进行细聊。

预售活动,一个商品,还未上市,提前进行预售,这是对市场需求的摸底。比如,某位歌手,要发行新的专辑,提前进行销售,根据预售的情况,进行生产,而不会造成大量库存积压。

粉丝为了自己偶像,冲击各种记录,比如几分钟销量破多少万,第一天销量多少万,而导致预售开始的前几十分钟,并发很高。

商家为了更好的刺激用户,会设置多种促销方案,比如,实时销量,用户购买排行榜,购买的用户可以解锁某个合成的海报,可以获得专辑的抽奖码等。所以,用户支付成功后,后端需要进行很多相应的处理。

根据上面的分析,预售活动,一般无需设置库存,也就不存在由于扣减库存导致的锁争夺而造成提交订单失败。

但是按照常规提交订单的流程,高并发去提交订单到一个数据库表中,这时服务器磁盘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缓存中的订单支付状态。这里需要注意:如果缓存订单在同步中,刚好支付成功回调了,要规避好边界点。

每一个技术,很难直接生产价值,只能依托于某个产品,去兑现价值。

高并发解决方案_高并发提交订单的解决方案相关推荐

  1. mysql高并发秒杀_高并发秒杀解决方案(转载)

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

  2. mysql并发量_高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

    推荐阅读: 学会这些微服务+Tomcat+NGINX+MySQL+Redis,再去面试阿里P7岗吧 "火爆"的微服务架构你还不会?从基础到原理的PDF文档快来学! Nginx负载均 ...

  3. mysql 高并发 响应时间_高并发,你真的了解吗?

    摘要:本文介绍高并发系统的度量指标,讲述高并发系统的设计思路,再梳理高并发的关键技术,最后结合作者的经验做一些延伸探讨. 当前,数字化在给企业带来业务创新,推动企业高速发展的同时,也给企业的IT软件系 ...

  4. 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...

    不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...

  5. 私有云 解决方案_私有云–理想的业务解决方案

    私有云 解决方案 The cloud computing solutions within companies seems to be a much preferred choice by IT ma ...

  6. 高并发处理方案_高并发系统下的缓存解决方案

    什么样的数据适合做缓存? 缓存和DB数据一致性在之前已讲过,详细可参考下面阅读推荐<如何保障mysql和redis之间的数据一致性>,我们这里讲一讲缓存穿透.缓存雪崩和击穿的三种场景解决方 ...

  7. 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现

    在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS. 本篇主要通过对AQS的实现原理.数据模型.资源共享方式.获取锁的过程, ...

  8. oracle rac 高并发性能_高并发业务下 JVM 涉及的垃圾回收与性能问题分析与定位...

    最近好多 Java 的朋友问:"高并发业务场景下,JVM涉及的性能问题好难搞呀--".看来是大家的技术经验相对少了些,拿不准该从哪些地方上手,其实,每个技术人要该懂得怎样更好打造自 ...

  9. Lua mysql insert 并发数_高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql

    Mysql客户端 lua-resty-mysql是为基于cosocket API的ngx_lua提供的Lua Mysql客户端,经过它能够完成Mysql的操做.默认安装OpenResty时已经自带了该 ...

最新文章

  1. 用ldap方式访问AD域的的错误解释
  2. 人工智能科学家发现 “衰老时钟”,我们的生物钟可以倒转
  3. Android友盟增量更新
  4. 文巾解题 180. 连续出现的数字
  5. (chap1 网络基础知识)网络的构成要素:(7)网关
  6. linux下不同arm 编译器的异同
  7. java链接mysql出问题_java连接MySQL出现问题
  8. php获取网页输出,PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)_PHP教程
  9. 一道多线程通信实例分析
  10. java多用户商城b2b2c源码
  11. Debian 决定允许无记名投票,候选人Felix Lechner质疑
  12. smbus使用 树莓派_Linux控制I2C/SMBus设备
  13. Flink 生态:Pulsar Connector 机制剖析
  14. 图解动软代码生成器使用(C#快捷生成代码)
  15. matlab取整函数记录
  16. 制作企业批量安装的WIN10封装镜像
  17. apkg格式怎么打开_PDF文件怎么压缩?这里有几个小技巧~
  18. IT十年人生过客-七-眉毛与恶名
  19. 正襟危坐说--操作系统(伍):进程间通信
  20. PPT和PPTX的区别是什么

热门文章

  1. java 图形库_OpenGL开放图形java库jogamp-all-platforms.7z
  2. 直方图和直条图_绘图专题 | 条形图/直方图傻傻分不清楚
  3. yarn资源参数配置
  4. Linux下修改python pip镜像源:推荐豆瓣源
  5. Linux echo命令:给文本着色/背景色/文本闪动
  6. eureka自我保护机制及配置
  7. 对用户密码进行md5加密的代码实现
  8. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)
  9. 如何将Felgo程序部署到Android中
  10. stm32f302 can通讯_福特福克斯发动机无法启动,诊断电脑还通讯不了怎么修?