一、秒杀场景

  1. 人多货少,只有少量的人能够抢购成功。
  2. 高并发,秒杀业务在开始之前流量比较平稳,开始后流量会直线性的上升。
  3. 持续时间短,秒杀开始随着库存的减少流量会以瀑布式的下降,这个过程持续时间很短,一般为秒级。

二、常见问题

  • 系统崩溃,导致系统崩溃的原因比较复杂,常见的有以下几点:

1、mysql操作时间长,优化表结构设计,合理建立索引,优化sql语句。通过调整尽量让sql语句的执行时间下降到30毫秒之内。至于如何优化sql操作感兴趣的可以关注我,以后会讲。

2、频繁的操作mysql,在秒杀场景中,高频率的操作mysql是大忌,使用缓存或队列来减少mysql的压力。

3、代码逻辑写的不合理或是业务本身导致,原则上尽量把可能造成较高性能消耗的逻辑靠后执行(下面系统 瓶颈会列出性能排序),通过层层验证阻断来减少消耗性能的逻辑执行,可重复利用的数据重复利用,减少性能低效的函数或第三方库使用。如果说是业务本身导致那基本无解,找负责人好好谈谈吧。

4、文本操作过于频繁,常见于日志的写入、配置文件的读取。php作为一门脚本语言处理能力比较低,每次执行都需要进行解析释放等很多不必要重复的环节导致消化性能,利用swoole会好一些,但依然不建议使用PHP开发。对于日志写入这个不管用什么语言都会遇到相同的问题,可以利用延迟写入或异步写入来解决。

5、带宽达到上限,这是一个经常会被忽视的细节,并发一上来总感觉慢,不知道为啥慢,看服务器的状态也抖很正常,其实很有可能是宽带跑满了。每一个用户的请求都会占用一定的宽带,所以尽量减少输入输出的大小,除此之外只能提高带宽来解决。

  • 库存超卖,在秒杀场景中库存超卖是很常见的问题,一般采用锁或原子操作来控制库存。
  • 机器人刷单攻击,对于火爆的单品很可能会被羊毛党进行刷单,在做防护的同时也需要强大自身防止服务器雪崩。

三、常见的系统瓶颈

对于系统瓶颈我们要先有一个处理速度上的基本认知,在程序开发的过程中我们劲量使用速度快的方式来处理,比如能用redis的别用mysql,能不夸机房请求的别夸机房,能内网的千万别外网,要合理的利用资源。

1、数据读写操作:程序自身数据读写>redis>mysql>磁盘

2、网络操作:本机>局域内网>跨机房>外网

四、正片

服务器层面的架构设计这里就不多做介绍了,感兴趣的可以看下这篇文章:电商系统设计艺术——高并发架构搭建

我们来看下应对秒杀场景都需要做哪些事

1、单独部署,这点基本上是必须要做的,秒杀场景往往突发流量会很高导致压垮服务器,如果未进行单独部署的话会导致其他业务也会受影响,单独部署可以有效的解决此问题,同时也更方便维护。

2、页面静态化,同时利用CDN或NGINX缓存可有效减少部分用户对后端业务的请求,将请求拦截在上游,同时前端页面还需要做到防止重复提交。

3、缓存应用,缓存可以说是一个神器,他能在很多层面来减少服务器的负担,常见的有利用缓存来减少数据库的操作。

4、限流、降级、熔断、隔离。秒杀只有少部分人可以抢购成功,限流可以挡住一大部分的流量。至于降级、熔断、隔离,这一系列的操作主要是为了保证服务的稳定性。虽然前端已经做了防重复提交手段,但是挡不住恶意用户利用机器人刷接口,这时候后端同样也需要做防重复提交的机制,IP锁,用户锁,口令等都可以,但是各有各的优缺点,结合实际场景使用,

5、削峰填谷,其实就是消息队列,如MQ,利用消息队列的特性将流量进行平滑过渡。

6、异步,在程序设计中能采用异步的地方就采用异步的形式,如:日志写入,下单等。

7、分布式负载,这个不用多说了吧,单机肯定是扛不住的,需要分布部署到多台机器上来分摊压力。

8、可伸缩,一是指业务的可扩展性,二是指方便服务器进行弹性伸缩的操作以便合理利用服务器资源。

搞完后差不多就是上面的这种结构图,有了基本的结构我们在具体的看下如何扣减库存来保证不超卖同时又保证性能高效。

扣库存的方式分为三大类,支付减库存、下单减库存、预扣库存。

1、下单减库存:

这种方式在扣库存的过程中如果采用一定的限制条件是不会出现超卖的情况:update set num = num - 1 where = num>0,这里需要特别注意WHERE条件,如果在num-1小于0的情况下是不会更新成功的,这就保证了不会出现超卖的情况,弊端就是这种sql在执行效率上比较抵效,而且需要频繁的去操作sql显然不适用秒杀场景。

2、支付减库存:

这种情况存在很多的弊端,从下面列举的弊端来看显然更加不适合秒杀场景。

1)会存在大量的垃圾订单(无法支付的订单)占用资源。

2)会造成下单后无法支付或支付后无法正常修改库存导致超卖,这是一个很严重的问题,老板被整破产都有可能~

3、预扣库存:

我们讲库存预先存入redis里,当用户下单后利用redis的原子特性预先去扣减redis里的库存量,当扣减成功后在去异步生成订单,这样可有效减少对数据库的直接操作同时又避免了超卖情况的发生,这么看来预扣库存更加适合的秒杀场景。

可以看到不管使用哪种扣库存的方式都会有一个超时取消订单的模块,当用户下单后不支付在超过一定的时间范围后会自动取消订单保证不少卖。

电商系统设计艺术——秒杀业务设计相关推荐

  1. 电商系统设计MySQL_基于MySQL设计的图书电商系统的制作方法

    本发明涉及一种图书销售系统,尤其涉及基于MySQL设计的图书电商系统. 背景技术: 相较于传统的图书经营模式,网络图书销售的成本更低,且图书信息更新快,而消费者也能够随时随地购买图书,完全不受时间和空 ...

  2. 电商库存系统设计mysql_详解:电商系统库存逻辑的设计

    原标题:详解:电商系统库存逻辑的设计 本文主要对电商平台的订单系统相关库存逻辑进行了详细的阐述,一起来文中看看~ 一.库存的概念 电商的业务场景中订单的流程常常伴随着库存的变化:对于erp来说,库存可 ...

  3. java运费模板设计_电商系统设计之运费模板(下)

    电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初中级工程师细看,大佬请随意 前言 在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在 ...

  4. 大型电商平台设计实例:电商平台总体设计和业务模型设计

    大型电商平台设计实例 本章我们将使用微服务架构风格设计一个大型电商平台,这个平台将以 Saas 方式提供一个类似于 S2B2C 的服务. 电商平台是 个大众化的应用平台,读 对它的功能都比较熟悉,本章 ...

  5. java运费模板设计_电商系统设计之运费模板(上)

    电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初中级工程师细看,大佬请随意 前言 在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在 ...

  6. Java生鲜电商平台-商品基础业务架构设计-商品设计

    Java生鲜电商平台-商品基础业务架构设计-商品设计 在生鲜电商的商品中心,在电子商务公司一般是后台管理商品的地方.在前端而言,是商家为了展示商品信息给用户的地方,它是承担了商品的数据,订单,营销活动 ...

  7. PHP电商运费模板,电商系统设计之运费模板(下)

    电商大伙每天都在用,类似某猫,某狗等. 电商系统设计看似复杂又很简单,看似简单又很复杂 本章适合初中级工程师细看,大佬请随意 前言 在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在 ...

  8. 关于电商系统的秒杀问题

    关于电商系统的秒杀问题 高并发下如何设计秒杀系统?这是一个高频面试题.这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识. 秒杀一般出现在商城的促销活动中,指定了一定 ...

  9. 实战分布式之电商高并发秒杀场景总览

    前言 本文是新系列"实战高并发"的开篇作.这个系列作为"我说分布式"的子系列,将着重挑选若干典型的分布式实战场景,尽量对当下高并发领域较为热门的架构及业务场景做 ...

最新文章

  1. 如何正确强制执行Git推送?
  2. 安卓python编辑器-有了这款编辑器,随时随地都能愉快的学习python!
  3. emacs for windows
  4. 微信小程序访问云数据库
  5. Elastic-Job重要概念
  6. 【原创】网络报文抓取研究
  7. FineUICore基础版部署到docker实战
  8. linux getdents 例子,Linux那些事儿之我是Sysfs(12)举例三:sysfs读入文件夹内容
  9. ubuntu用户目录安装pip(无root权限)
  10. Xtrareport 交叉报表
  11. 调整DOS窗口大小的方法 2021-03-06
  12. 【爬虫】微博数据采集
  13. Thread.MemoryBarrier 方法
  14. UninstallPKG 1.1.9 Mac卸载工具
  15. jetson tk1开发(4)-tensorflow安装与配置
  16. 万字深度好文!VL最强总结!
  17. php中网页生成图片的方式,类似长微博图片生成器
  18. BUCK降压斩波电路MATLAB SIMULINK仿真
  19. vivado hls 2019.1百度云安装包,包含license
  20. MATLAB cwt连续小波变换 绘制小波振幅谱(影响锥coi)的三个函数示例(cwt contourf pcolor)

热门文章

  1. 《Devops实践指南》学习总结(全干货)
  2. MATLAB GUI制作快速入门
  3. nginx使用Proxy-protocal
  4. 怎么用matlab读一张图像,利用matlab读取图像
  5. 米联客 ZYNQ/SOC 精品教程 S02-CH19 利用BRAM进行PS与PL间数据交互
  6. 没有一间“完美”的IT企业
  7. Educoder/头歌JAVA——JAVA面向对象:封装、继承和多态
  8. 经典算法(5)杨辉三角
  9. [2006-07-04]工作手记
  10. IP地址子网划分方法思路详解(附例题)