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

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

 

 


推荐阅读
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍如何下载并安装MySQL数据库(5.7.10版本),以及配置Navicat管理工具(免费版)。通过本指南,您将了解从下载到安装的完整流程,并掌握基本的数据库管理技能。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
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社区 版权所有