我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解秒杀系统设计的5个要点

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解秒杀系统设计的5个要点

秒杀系统涉及到的知识点

  • 高并发,cache,锁机制
  • 基于缓存架构redis,Memcached的先进先出队列。
  • 稍微大一点的秒杀,肯定是分布式的集群的,并发来自于多个节点的JVM,synchronized所有在JVM上加锁是不行了
  • 数据库压力
  • 秒杀超卖问题
  • 如何防止用户来刷, 黑名单?IP限制?
  • 利用memcached的带原子性特性的操作做并发控制

秒杀简单设计方案

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

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

第一步 如果Java层做过滤,可以在每台web服务器的业务处理模块里做个计数器AtomicInteger(10)=待秒商品总数,decreaseAndGet()>=0的继续做后续处理,<0的直接返回秒杀结束页面,这样经过第一步的处理只剩下100台*10个=1000个请求。

第二步,memcached 里以商品id作为key的value放个10,每个web服务器在接到每个请求的同时,向memcached服务器发起请求,利用memcached的decr(key,1)操作返回值>=0的继续处理,其余的返回秒杀失败页面,这样经过第二步的处理只剩下100台中最快速到达的10个请求。

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

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

看看淘宝的秒杀

一、前端

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

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

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

限流:一般都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。或者活动入口的时候增加游戏或者问题环节进行消峰操作。

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

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

  • 首先MySQL自身对于高并发的处理性能就会出现问题,一般来说,MySQL的处理性能会随着并发thread上升而上升,但是到了一定的并发度之后会出现明显的拐点,之后一路下降,最终甚至会比单thread的性能还要差。
  • 其次,超卖的根结在于减库存操作是一个事务操作,需要先select,然后insert,最后update -1。最后这个-1操作是不能出现负数的,但是当多用户在有库存的情况下并发操作,出现负数这是无法避免的。
  • 最后,当减库存和高并发碰到一起的时候,由于操作的库存数目在同一行,就会出现争抢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、后端两条路【内存】+【排队】

Github地址:github.com/Tyson0314/j…

以上就是详解秒杀系统设计的5个要点的详细内容,更多关于秒杀系统设计的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解秒杀系统设计的5个要点

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解秒杀系统设计的5个要点

这篇文章主要为大家介绍了秒杀系统设计的5个要点详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-06

如何使用nodejs设计一个秒杀系统的方法

小编给大家分享一下如何使用nodejs设计一个秒杀系统的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!js的作用是什么1、能够嵌入动态文本于HTML页面。2、对浏览器事件做出响应。3、读写HTML元素。4、在数据被提交
2023-06-14

干线子系统设计特点详解

  综合布线系统应是开放式星型拓扑结构,应能支持电话、数据、图文、图像等多媒体业务需要。  综合布线系统可划分成六个部分,其中三个子系统:配线(水平)子系统(TO—FD);干线(垂直)子系统(FD—BD);建筑群子系统(BD—CD);外加三个部分:工作区(TO—TE)、设
干线子系统设计特点详解
2024-04-18

一文透彻详解.NET框架类型系统设计要点

.NET框架的类型系统是构建安全、可靠应用程序的基础。其要点包括通用类型系统(CTS)、公共语言运行时(CLR)、类型安全性、值类型和引用类型、接口和基类、泛型、元数据以及动态类型、委托和事件。CTS确保类型互操作性;CLR强制执行类型安全;值类型和引用类型影响内存管理;接口和基类支持代码重用;泛型实现类型安全的可重用性;元数据提供类型信息;动态类型提供灵活性;委托和事件促进松散耦合和响应性。
一文透彻详解.NET框架类型系统设计要点
2024-04-02

Android跳转系统设置Settings的各个界面详解

系统设置Settings中定义的一些常用的各界面ACTION常量,下面这篇文章主要给大家介绍了关于Android跳转系统设置Settings的各个界面,文中介绍非常详细,需要的朋友可以参考下
2023-01-06

软考系统架构设计师考试分几个科目?每个科目的重点是什么?

软考系统架构设计师考试旨在评估考生在系统架构设计方面的综合能力,考试分为三个科目:综合知识、案例分析和论文。每个科目都有其独特的重点和考查内容。具体请见下文。
软考系统架构设计师考试分几个科目?每个科目的重点是什么?
2024-09-11

Win10怎么创建Wifi热点?Win10系统笔记本设置WiFi共享的方法详解

如今,Win10创建Wifi热点非常简单,可以使用的工具非常多,只需要在Win10笔记本中安装使用W编程客栈ifi共享精灵、360安全卫士、金山卫士、鲁大师、116Wifi等软件,就可以轻松的在笔记本创建Wifi热点,让附近的智能手机/平板
2023-06-08

如何在MySQL中设计一个安全性高且易于维护的会计系统表结构以满足合规要求?

如何在MySQL中设计一个安全性高且易于维护的会计系统表结构以满足合规要求?随着数字化时代的到来,会计系统在企业中扮演着至关重要的角色。设计一个安全性高且易于维护的会计系统表结构对于确保财务数据的完整性和准确性至关重要。本文将提供一些指导原
如何在MySQL中设计一个安全性高且易于维护的会计系统表结构以满足合规要求?
2023-10-31

Win8系统电脑插入手机提示这台计算机连接的前一个USB设备不正常的解决方法图文教程

有时候我们会把手机数据数据传输到Win8系统电脑中,可是有些用户说手机插上电脑后,在电脑桌面右下角却出现了“无法识别的USB设备,跟这台计算机连接的前一个USB设备工作不正常,Windows无法识别它”的提示,导致连
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录