一、问题的提出

秒杀或抢购活动一般会经过 预约,下单,支付 ,扛不住的地方在于下单,一般会带来2个问题:

1、高并发

比较火热的秒杀在线人数都是10w起的,如此之高的在线人数对于网站架构从前到后都是一种考验。

2、超卖

任何商品都会有数量上限,如何避免成功下订单买到商品的人数不超过商品数量的上限,这是每个抢购活动都要面临的难题。

秒杀系统难做的原因:库存只有一份,瞬间大量用户读和写这些数据。

例如小米手机每周二的秒杀,可能手机只有1万部,但瞬时进入的流量可能是几百几千万

二、架构

常见站点架构如下

1)浏览器端,最上层,会执行到一些JS代码

2)站点层,这一层会访问后端数据,返回数据给浏览器

3)服务层,向上游屏蔽底层数据细节

4)数据层,最终的库存是存在这里的

三、优化思路

1、将请求尽量拦截在上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据库读写锁冲突严重,导致响应慢,下单基本不能成功

2、利用缓存:这是一个典型的读多些少的应用场景,非常适合使用缓存

四、优化细节

1 、浏览器层请求拦截

a)产品层面,用户点击“查询”或者“购票”后,按钮置灰,禁止用户重复提交请求

b)js层面,限制用户在x秒之内只能提交一次请求

可以拦截很多无效请求

2、站点层请求拦截与页面缓存

防止像服务器直接发送过多的恶意http请求

a)同一个uid,限制访问频度,做页面缓存,x秒内到达站点层的请求,均返回同一页面

b)同一个item的查询,例如手机车次,做页面缓,x秒内到达站点层的请求,均返回同一页面

可以拦截很多无效请求

3、服务层请求拦截与数据缓存

a)给过多的请求去数据库有什么意义呢?对于写请求,做请求队列,每次只透过有限的写请求去数据层,如果均成功再放下一批,如果库存不够则队列里的写请求全部返回“已售完

b)对于读请求cache来抗,用memcached or redis(10wqps)

如此限流,只有非常少的写请求,和非常少的读缓存mis的请求会透到数据层去

4、数据层闲庭信步

到了数据这一层,几乎就没有什么请求了,库存是有限的,透过过多请求来数据库没有意义

五、解决方案

关于超卖,首先设定一个前提,为了防止超卖现象,所有减库存操作都需要进行一次减后检查,保证减完不能等于负数。(由于MySQL事务的特性,这种方法只能降低超卖的数量,但是不可能完全避免超卖)

update number set x=x-1 where (x -1 ) >= 0; 

解决方案1:

将存库从MySQL前移到Redis中,所有的写操作放到内存中,由于Redis中不存在锁故不会出现互相等待,并且由于Redis的写性能和读性能都远高于MySQL,这就解决了高并发下的性能问题。然后通过队列等异步手段,将变化的数据异步写入到DB中。

优点:解决性能问题

缺点:没有解决超卖问题,同时由于异步写入DB,存在某一时刻DB和Redis中数据不一致的风险。

解决方案2:

引入队列,然后将所有写DB操作在单队列中排队,完全串行处理。当达到库存阀值的时候就不在消费队列,并关闭购买功能。这就解决了超卖问题。

优点:解决超卖问题,略微提升性能。

缺点:性能受限于队列处理机处理性能和DB的写入性能中最短的那个,另外多商品同时抢购的时候需要准备多条队列。

解决方案3:

将写操作前移到MC中,同时利用MC的轻量级的锁机制CAS来实现减库存操作。

优点:读写在内存中,操作性能快,引入轻量级锁之后可以保证同一时刻只有一个写入成功,解决减库存问题。

缺点:没有实测,基于CAS的特性不知道高并发下是否会出现大量更新失败?不过加锁之后肯定对并发性能会有影响。

解决方案4:

将提交操作变成两段式,先申请后确认。然后利用Redis的原子自增操作(相比较MySQL的自增来说没有空洞),同时利用Redis的事务特性来发号,保证拿到小于等于库存阀值的号的人都可以成功提交订单。然后数据异步更新到DB中。

优点:解决超卖问题,库存读写都在内存中,故同时解决性能问题。

缺点:由于异步写入DB,可能存在数据不一致。另可能存在少买,也就是如果拿到号的人不真正下订单,可能库存减为0,但是订单数并没有达到库存阀值。

总结

扩容+限流+内存缓存+排队

转载于:https://www.cnblogs.com/chenpingzhao/p/6195788.html

关于秒杀的系统架构优化思路相关推荐

  1. 秒杀系统架构优化思路

    本文曾在"架构师之路"上发布过,近期支援Qcon-AS大会,在微信群里分享了该话题,故对原文进行重新整理与发布. 架构师之路16年精选50篇 一.秒杀业务为什么难做 1)im系统, ...

  2. 阿里秒杀系统架构优化思路

    秒杀业务为什么难做 im系统,例如qq或者微博,每个人都读自己的数据(好友列表.群列表.个人信息) 微博系统,每个人读你关注的人的数据,一个人读多个人的数据 秒杀系统,库存只有一份,所有人会在集中的时 ...

  3. (转载)秒杀系统架构优化思路

    转载自:  https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959391&idx=1&sn=fb28fd5e ...

  4. 秒杀抢单系统软件架构优化思路

    文章目录 一.秒杀业务为什么难做 二.优化方向 三.常见秒杀架构 四.各层次优化细节 第一层,客户端怎么优化(浏览器层,APP层) 第二层,站点层面的请求拦截 第三层,服务层来拦截(反正就是不要让请求 ...

  5. Entity Framework 数据并发访问错误原因分析与系统架构优化

    本文主要记录近两天针对项目发生的数据访问问题的分析研究过程与系统架构优化,我喜欢说通俗的白话,高手轻拍 1. 发现问题 系统新模块上线后,使用频率较高,故在实际使用和后期的问题重现测试中,产生了一下系 ...

  6. 阿里云存储表格存储TableStore-高并发IM系统架构优化实践

    文章地址:https://yq.aliyun.com/articles/66461?utm_campaign=66461&utm_medium=images&utm_source=os ...

  7. 网购秒杀的系统架构设计

    1.秒杀活动的技术挑战: 1.1 对现有网站业务造成冲击 1.2 高并发下的应用,数据库负载 1.3 突然增加的网络及服务器带宽 1.4 直接下单 2.秒杀系统对应策略: 2.1 秒杀系统独立部署: ...

  8. SpringBoot整合Redis实现优惠券秒杀服务(笔记+优化思路版)

    本文属于看黑马的redis的学习笔记,记录了思路和优化流程,精简版最终版请点击这里查看. 文章目录 一.全局ID生成器 1.1 理论 1.1.1 全局唯一ID生成策略 1.2 代码(Redis自增) ...

  9. Node.js 多进程/线程 —— 日志系统架构优化实践

    1. 背景 在日常的项目中,常常需要在用户侧记录一些关键的行为,以日志的形式存储在用户本地,对日志进行定期上报.这样能够在用户反馈问题时,准确及时的对问题进行定位. 为了保证日志信息传输的安全.缩小日 ...

最新文章

  1. 南方人过年 VS 北方人过年
  2. 7.1.2 定义改进的Sales_date类
  3. datatables 响应式
  4. 转载:数据库索引的底层原理
  5. mysql可重复读理解
  6. xp系统internet信息服务器地址,XP系统下Internet信息服务IIS的安装方法
  7. Linux 下制作虚拟软盘镜像
  8. 用计算机软件绘制思维导图,无需其他软件!用Word 2016快速制作思维导图
  9. 《路由器开发 - 路由器刷机指南》联想Newifi Y1刷机
  10. 张小龙是高球冠军,大前研一是物理学家:​为什么牛人在很多领域都是世界第一?...
  11. ubuntu添加桌面快捷方式图标
  12. django memery cache
  13. 编译器提示old-style parameter declarations
  14. 小米progtx笔记本快捷键驱动安装
  15. pdf编辑器免安装版_墙裂推荐!功能强大的PDF编辑器最新免安装版!
  16. 企业核心-不是技术而是人才
  17. NVIDIA Tesla GPU系列P4、T4、P40以及V100显卡性能的对比
  18. Directshow完整介绍
  19. 数据结构PTA习题:基础实验7-2.3 德才论 (25分)——排序
  20. 深度学习研究生如何快速提升代码能力,写出高效的代码?

热门文章

  1. 艺术美的价值是什么?
  2. 分享一个真正高收益,一本万利的行业
  3. 今天tiktok小社群更新 第5个项目行业案例
  4. Rust 语言本身的问题
  5. 利用iptabls的NFLOG记录自己的HTTP HTTPS上网行为
  6. jdbc数据源连接oracle,请教JDBC怎么连接ORACLE数据库
  7. Excel 2007 Open XML文件结构~~~1
  8. Python3 找不到库
  9. 如何自学并且系统学习计算机网络?(知乎问答)
  10. 无锁atomicInteger