`
cfyme
  • 浏览: 263217 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

秒杀系统设计的知识点

 
阅读更多

秒杀系统涉及到的知识点:

 

A, 高并发,cache,锁机制 

 

B, 基于缓存架构redis,Memcached的先进先出队列。

 

C, 稍微大一点的秒杀,肯定是分布式的集群的,并发来自于多个节点的JVM,synchronized所有在JVM上加锁是不行了

 

D, 数据库压力

 

E, 秒杀超卖问题

 

F, 如何防止用户来刷, 黑名单?IP限制?

 

G, 利用memcached的带原子性特性的操作做并发控制. 

 

 

秒杀简单设计方案如:

比如有10件商品要秒杀,可以放到缓存中,读写时不要加锁。 当并发量大的时候,可能有25个人秒杀成功,这样后面的就可以直接抛秒杀结束的静态页面。进去的25个人中有15个人是不可能获得商品的。所以可以根据进入的先后顺序只能前10个人购买成功。后面15个人就抛商品已秒杀完。

 

 

 

 

 

假设我们的秒杀场景:

       比如某商品10件物品待秒. 假设有100台web服务器(假设web服务器是Nginx + Tomcat),n台app服务器,n个数据库 

 

 1. 第一步 如果Java层做过滤, 可以在每台web服务器的业务处理模块里做个计数器AtomicInteger(10)=待秒商品总数, 

 decreaseAndGet()>=0的继续做后续处理, <0的直接返回秒杀结束页面. 

 这样经过第一步的处理只剩下100台*10个=1000个请求. 

 

 2. 第二步, memcached 里以商品id作为key的value放个10, 每个web服务器在接到每个请求的同时, 向memcached服务器发起请求, 利用memcached的decr(key,1)操作返回值>=0的继续处理, 其余的返回秒杀失败页面. 

 这样经过第二步的处理只剩下100台中最快速到达的10个请求.

 

 3. 第三步, 向App服务器发起下单操作事务. 

 

 4. 第四步, App服务器向商品所在的数据库请求减库存操作, 

 (操作数据库时可以 "update table set count=count-1 where id=商品id and count>0;" update 成功记录数为1, 再向订单数据库添加订单记录, 都成功后提交整个事务, 否则的话提示秒杀失败. 用户进入支付流程. 

 

 

 

 

在看看淘宝的秒杀:

1、前端

面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】

  A:扩容

  加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。

  B:静态化

  将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。

  C:限流

  一般都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。

  或者活动入口的时候增加游戏或者问题环节进行消峰操作。

  D:有损服务

  最后一招,在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动整体的可用性。

2、后端

 

那么后端的数据库在高并发和超卖下会遇到什么问题呢

  I: 首先MySQL自身对于高并发的处理性能就会出现问题,一般来说,MySQL的处理性能会随着并发thread上升而上升,但是到了一定的并发度之后会出现明显的拐点,之后一路下降,最终甚至会比单thread的性能还要差。

  II: 其次,超卖的根结在于减库存操作是一个事务操作,需要先select,然后insert,最后update -1。最后这个-1操作是不能出现负数的,但是当多用户在有库存的情况下并发操作,出现负数这是无法避免的。

  III:最后,当减库存和高并发碰到一起的时候,由于操作的库存数目在同一行,就会出现争抢InnoDB行锁的问题,导致出现互相等待甚至死锁,从而大大降低MySQL的处理性能,最终导致前端页面出现超时异常。

 

针对上述问题,如何解决呢? 淘宝的高大上解决方案:

  I:  关闭死锁检测,提高并发处理性能。

  II:修改源代码,将排队提到进入引擎层前,降低引擎层面的并发度。

  III:组提交,降低server和引擎的交互次数,降低IO消耗。

 

解决方案1:

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

优点:解决性能问题

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

 

解决方案2:

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

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

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

 

解决方案3:

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

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

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

 

解决方案4:

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

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

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

 

三、总结

1、前端三板斧【扩容】【限流】【静态化】

2、后端两条路【内存】+【排队】

 

 以上所有资料均来自互联网

 

分享到:
评论

相关推荐

    springboot193基于SpringBoot的秒杀系统设计与实现_rar.zip

    通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入...

    使用JAVA开发的秒杀系统源码

    彻底理解“秒杀”系统的各个关键点 可以搭建一套适合自己业务场景的高可用、高并发、高性能系统 适用人群: 刚学完Java的学员; 有工作经验的程序员; 需要进一步提升自己的潜力股; 面试找工作者; 需要解决工作...

    miaosha::star::star::star::star:秒杀系统设计与实现。互联网工程师进阶与分析:person_raising_hand::rooster:

    高并发大流量如何进行秒杀架构,我对这部分知识做成一个系统的整理,写了一套系统。本GitHub还有很多其他的知识,随时欢迎讨论与骚扰!这里还在更新如果文章出现瑕疵请及时与我联系! ps:本文章基础思想来自于鱼...

    Java秒杀系统方案优化高性能高并发学习实战源代码以及笔记..zip

    Java秒杀系统方案优化高性能高并发学习实战源代码以及笔记..zip 章节笔记 第1章-课程介绍及项目框架搭建 知识点 使用spring boot 搭建项目基础框架 使用Thymeleaf做页面展示,封装Result统一结果 集成 mybatis + ...

    基于SSM框架+Redis实现的线上秒杀系统项目源码+项目说明.zip

    基于SSM框架+Redis实现的线上秒杀系统项目源码+项目说明.zip 最近把SSM框架的基础知识撸了一遍,跟着[github上的这个项目](https://github.com/codingXiaxw/seckill) ,实现了一下秒杀系统,并对这个项目中存在的...

    cat-mall:尚硅谷《谷粒商城》-开发笔记,另外学习文档笔记,期待大家的加入,

    弹性搜索Redis基本使用与Lua脚本Redisson分布式锁性能压测模拟Nginx反向代理,动静分离,负载均衡多线程与初步单点登录与社交登录RabbitMQ消息静脉Nacos服务注册,发现,配置中心分散事务与Seata秒杀系统设计定时...

    java8源码-JavaInterview:Java面试

    面试知识点 公司面经 Java 基础 容器(包括juc) 并发 JVM Java8 计算机网络 计算机操作系统 Linux 数据结构与算法 数据结构 算法 数据库 MySQL mysql(优化思路) 系统设计 秒杀系统相关 前后端分离 单点登录 常用...

    Shop7z网上购物系统源码 v2.3

    Shop7z网上购物系统是由国家版权局注册登记、拥有完全自主知识产权的购物系统,支持多级分类菜单DIY导航功能,系统独特的灵活性和可扩充性,能够满足各行业的不同需求,具有功能强大、安全性高、智能灵活等特点。...

    小程序运营管理系统源码 自由DIY布局 一键生成小程序.rar

    付费视频系统:付费视频是为了维护视频版权,促进用户知识付费的一种手段。 多规格商城:多规格商城是指在商城中能够选取规格、多规格匹配。点击购买弹出弹框,用来选择规格和选择购买数量,并和库存匹配。 ...

    开源bbs源码java-miaosha:miaosha

    本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 核心知识点: 1.分布式:nginx反向代理,分布式...

    小程序运营管理系统源码.zip

    付费视频系统:付费视频是为了维护视频版权,促进用户知识付费的一种手段。 多规格商城:多规格商城是指在商城中能够选取规格、多规格匹配。点击购买弹出弹框,用来选择规格和选择购买数量,并和库存匹配。 积分...

    java8源码-learn-java:学习Java

    java8 源码 :thumbs_up:推荐:PDF 版本在 ... 中文 | Great Java ...是一个程序员福地,这里有各种厉害的开源框架、软件或者教程。这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 ...秒杀系统设计与实现.互

    GEEKQ-CM::palm_tree::star::elephant:互联网分布式影院系统:palm_tree::star:

    高并发大流量如何进行秒杀架构,我对这部分知识做成一个系统的整理,写了一套系统。本GitHub还有很多其他的知识,随时欢迎讨论与骚扰!请及时与我联系! 文章还有很多不足,我仍在不断改进!页面还只是在开发阶段,...

    Shop7z网上购物系统 v2.7

    Shop7z网上购物系统是由国家版权局注册登记、拥有完全自主知识产权的购物系统,集大气超美观页面+商品组合套餐+限时抢购秒杀+图片批量上传+淘宝数据包导入+弹出式分类菜单+不同规格不同价格+物流跟踪打印查询+会员...

    Shop7z网上购物系统源码 v2.6

    Shop7z网上购物系统是由国家版权局注册登记、拥有完全自主知识产权的购物系统,集大气超美观页面+商品组合套餐+限时抢购秒杀+图片批量上传+淘宝数据包导入+弹出式分类菜单+不同规格不同价格+物流跟踪打印查询+会员...

    Shop7z网上购物系统源码 v2.4

    Shop7z网上购物系统是由国家版权局注册登记、拥有完全自主知识产权的购物系统,集大气超美观页面+商品组合套餐+限时抢购秒杀+图片批量上传+淘宝数据包导入+弹出式分类菜单+不同规格不同价格+物流跟踪打印查询+会员...

Global site tag (gtag.js) - Google Analytics