热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

电商系统设计艺术——秒杀业务设计

一、秒杀场景人多货少,只有少量的人能够抢购成功。高并发,秒杀业务在开始之前流量比较平稳,开始后流量会直线性的上升。持续时间短࿰

一、秒杀场景


  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里的库存量,当扣减成功后在去异步生成订单,这样可有效减少对数据库的直接操作同时又避免了超卖情况的发生,这么看来预扣库存更加适合的秒杀场景。

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

 

 


推荐阅读
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
  • 本文介绍了Paxos的世界中关于复制日志与状态机的概念和重要性。通过存储日志来实现数据的持久化,并通过日志流来记录数据的变化,而不是直接持久化数据本身。这样做的好处是简化了持久化存储的操作,并且方便多机之间的数据同步。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • 构建LNMP架构平台
    LNMP架构的组成:Linux、Nginx、MySQL、PHP关于NginxNginx与apache的作用一样,都是为了搭建网站服务器,由俄罗斯人lgorsysoev开发,其特点是 ... [详细]
author-avatar
金子祺_475
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有