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

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

 

 


推荐阅读
  • 本文探讨了现代分布式架构的多样性,包括高并发、多活数据中心、容器化、微服务、高可用性和弹性架构等,并介绍了与这些架构相关的重要管理技术,如DevOps、应用监控和自动化运维。文章还深入分析了分布式系统的核心概念、主要用途及类型,同时对比了单体应用与分布式服务化的优缺点。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • 为何我选择了华为云GaussDB数据库
    本文分享了作者选择华为云GaussDB数据库的理由,详细介绍了GaussDB(for MySQL)的技术特性和优势,以及它在金融和互联网行业的应用场景。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 本文详细介绍了在 Windows 7 系统中配置 Nginx 1.10.3 和 PHP 7.1.1 NTS 的步骤,包括修改 PHP 配置文件、处理依赖项以及创建批处理脚本启动和停止服务。重点解释了如何解决常见的运行时错误。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • ThinkPHP 数据库配置详解
    本文详细介绍了如何在 ThinkPHP 框架中正确配置数据库连接参数,包括数据库类型、服务器地址、数据库名称等关键配置项。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • 本文详细介绍了 phpMyAdmin 的安装与配置方法,适用于多个版本的 phpMyAdmin。通过本教程,您将掌握从下载到部署的完整流程,并了解如何根据不同的环境进行必要的配置调整。 ... [详细]
  • 在尝试从数据库获取设置的过程中,遇到了一个致命错误:Fatal error: Call to a member function bind_param() on boolean。本文将详细分析该错误的原因,并提供解决方案。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • MySQL Debug 模式的实现与应用
    本文详细介绍了如何启用和使用 MySQL 的调试模式,包括编译选项、环境变量配置以及调试信息的解析。通过实际案例展示了如何利用调试模式解决客户端无法连接服务器的问题。 ... [详细]
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社区 版权所有