【图解秒杀系列】秒杀技术点——秒杀按钮点亮、削峰

news2024/9/21 22:23:16

【图解秒杀系列】秒杀技术点——秒杀按钮点亮、削峰

  • 秒杀按钮点亮
    • 涉及的问题以及解决办法
    • 处理流程
  • 削峰
    • 答题 & 验证码
      • 具体流程
    • 排队

秒杀按钮点亮

在秒杀场景中,秒杀商品页面是需要处理按钮点亮的逻辑的。在秒杀未开始前,按钮置灰,不可点击;在秒杀开始时,按钮会被点亮,此时用户客户端点击按钮。

涉及的问题以及解决办法

如果页面是由服务端动态生成的,那么这个按钮置灰点亮就很容易控制。但是为了减轻服务器负载压力,我们一般设计把页面静态化并存储到CDN中。因此在生成的这个静态页面中,会加入一个特殊JavaScript,该JavaScript携带了秒杀是否开始的标识,该JavaScript不会被浏览器缓存,每次刷新页面都会请求一次,由于该JavaScript文件的体积很小,因此每次刷新页面都请求一次也不会对服务器造成什么压力。

在这里插入图片描述

一开始JavaScript服务器返回的特殊JavaScrip中的秒杀开始标识为未开始。然后有一台Linux服务器,该服务器上面跑着一个定时任务,当秒杀到期时,该服务器向JavaScript服务器集群推送新的特殊JavaScript文件,该文件中的秒杀开始标识为开始。

在这里插入图片描述

除此以外,用户有可能会通过F12或其他手段拿到下单的URL,在秒杀未开始前就请求下单的接口。为了解决这种问题,我们的下单接口增加一个随机数参数,下单时要验证服务器上的随机数与请求携带的随机数是否一致,如果不一致则下单失败。在秒杀开始时,Linux服务器会生成随机数并推送给下单服务集群,然后在新生成的JavaScript文件中会携带该随机数。

在这里插入图片描述

处理流程

在这里插入图片描述

  1. 浏览器刷新秒杀商品页面,会请求CDN服务器获取静态HTML页面。
  2. 每次刷新页面,都会请求JavaScript服务器获取特殊JavaScript文件。
  3. 秒杀开始时,Linux服务器上的定时任务到期,会生成下单URL随机数并推送给下单服务器集群,然后生成新的JavaScript文件并推送给JavaScript服务器,新JavaScript文件的秒杀开始标识为已开始,并且携带下单URL随机数参数。
  4. 秒杀开始后,浏览器刷新页面,请求获取到最新的JavaScript文件,发现秒杀开始标识为已开始,按钮被点亮。

还有很多秒杀商品页面是有倒计时的,倒计时到期后按钮就会马上点亮,这种就在页面倒计时到期时自动触发请求一次JavaScript文件进行局部刷新即可。

削峰

秒杀场景一般伴随着流量突刺的现象,也就是一瞬间大量并发请求涌入。如果不对这种瞬时大流量做一定的处理,服务器可能会扛不住瞬时的压力。

削峰就是一种处理流量突刺很好的手段,削峰的思想就是通过增加一定的机制或处理步骤,把原先的流量峰值削平,比如把1s内瞬时的大流量均摊到几秒甚至一分钟内,这样服务器就能顺利度过秒杀抢购的这段峰值时期。

在这里插入图片描述

答题 & 验证码

答题或者验证码机制是达到削峰效果的一种非常有效的手段。在没有答题或验证码机制的前提下,用户点击按钮,就会触发下单请求,由于用户戳按钮的速度是非常快的,很容易造成流量突刺。

增加了答题或者验证码机制后,每个用户答题或输入验证码的速度都是不一样的,有的快有的慢,这就有效的把不同用户下单的请求在时间上错开了,很好的把一瞬间的请求均摊到一个相对较长的时间范围内,使得服务承受的并发压力大大降低。

在这里插入图片描述

具体流程

当用户点击按钮时,会先请求验证码服务获取验证码图片。验证码服务会生成验证码并存入redis,然后根据验证码生成验证码图片返回客户端。

在这里插入图片描述

我们可以对生成的验证码进行加密,加密后存入redis的就是一个signature(签名)。

然后用户输入验证码,点击确定按钮,然后浏览器会向后端秒杀系统发起请求,并且请求参数中携带用户输入的验证码。

在这里插入图片描述

如果存入redis是加密后的signature值,那么验证时也有以同样的加密方式对用户输入的验证码进行加密后,再与redis中的signature值进行比对。

排队

排队是另一种削峰的手段,我们通过消息队列缓存用户下单的请求,然后迅速响应用户一个中间结果。然后后台的异步服务异步消费mq里的消息进行下单操作,通过这种异步处理的手段,就可以很好的起到削峰填谷的效果。

在这里插入图片描述

当后台异步下单成功后,往redis写入下单结果,秒杀服务就可以查询redis得知下单成功与否,然后把下单结果显示到页面上。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

POSIX信号量semaphore实现线程同步

POSIX标准定义了信号量接口如下&#xff0c;常常用于线程间同步。 #include <semaphore.h>int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_destroy(sem_t *sem); int sem_post(sem_t *sem); int sem_wait(sem_t *sem); sem_init()在sem指向的地址…

微信小程序反编译工具

目录 介绍 工程结构还原 微信开发者工具运行 如何查看当前运行版本? 开启小程序F12 重新打包运行 效果示例 安装 用法 参数说明 获取微信小程序AppID 文件夹名即为AppID 下载地址 介绍 纯Golang实现,一个用于自动化反编译微信小程序的工具,小程序安全利器, 自…

【杂谈】-8个常用的Python图像操作库

8个常用的Python图像操作库 文章目录 8个常用的Python图像操作库1、OpenCV2、Pillow&#xff08;PIL&#xff09;3、Scikit Image4、Numpy5、SciPy6、Mahotas7、SimpleITK8、Matplotlib 在当今世界&#xff0c;数据在每个行业垂直领域中都发挥着至关重要的作用。图像可以是提取…

Redis 操作的原子性及其保证机制

Redis 操作的原子性及其保证机制 1、单命令的原子性2、事务的原子性3、并发操作的考虑4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Redis 的操作之所以是原子性的&#xff0c;主要得益于其单线程的执行模型。这种模型确保了每个命…

5.9.8 最优化控制初探——PID参数优化

总目录&#xff1a;http://t.csdnimg.cn/YDe8m 5.9.8 最优化控制初探——PID参数优化 之前在“A_2_PID控制转速例程”例程中&#xff0c;PID参数是手动调节的。然而在已经获得系统完整数学模型的情况下&#xff0c;我们可以使用效率更高的方法&#xff0c;即最优化控制。先来看…

Nios II新建项目

1.Nios II Application and BSP form Template BSP:board support package&#xff08;板级支持包&#xff09; 2.Nios II Sotware Examples SOPC Information File name:选择项目文件夹下的 .sopcinfo 文件 Project name:自定义名称 Project location:Use default locatio…

删除镜像报容器依赖错误

1、删除镜像报容器依赖错误 出现这个错误的原因是因为5303b5323a4c容器使用了此镜像。解决&#xff1a;先停止容器、删除容器、之后再镜像即可。 2、查看镜像对应的容器 # docker ps -a | grep 611a37aa5ffc 3、先停止容器 # docker stop 5303b5323a4c 4、删除容器 # do…

Spring Boot: 2.7.x 至 2.7.18 及更旧的版本,漏洞说明

本文提供的修复指南将帮助开发者有效规避 CVE-2024-38808 和 CVE-2024-38809 的风险。如果你正在使用老版本的 Spring Boot&#xff0c;请尽快参考本文进行修复与升级。 此漏洞来源于spring官网&#xff1a;https://spring.io/blog/2024/08/14/spring-framework-releases-fixe…

flink车联网项目前篇:业务实现1(第67天)

系列文章目录 业务实现 3.1 创建catalog 3.1.1 vvp 3.1.2 mysqlcdc 3.1.2.1 使用限制 3.1.2.2 配置MySQL Catalog 3.1.3 xxxxpm 3.1.3.1 下载Paimon插件 3.1.3.2 在MaxCompute项目中上传Paimon插件 3.1.3.3 创建自定义Catalog类型 3.1.3.5 配置catalog 3.1.4 xxxxx 3.1.4.1 背…

Linux设置yum源为阿里云镜像源

一、验证网络是否可以连接阿里云镜像 #验证网络是否可以连接阿里云镜像 ping mirrors.aliyun.com如果ping不通&#xff0c;则找一台可以连接外网的电脑&#xff0c;ping一下mirrors.aliyun.com&#xff0c;找到mirrors.aliyun.com对应的ip。 二、 手动配置 #删除原yum源 rm -…

微信小程序免费《短视频去水印》

分享一个uniapp开发的微信小程序免费《短视频去水印》小程序 <template><view class"content"><view class"area-wrap"><textarea name"" v-model"state.content" maxlength"800" id"" cols…

接口自动化测试怎么做?该怎么学习

一. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…

《黑神话:悟空》媒体评分解禁 M站均分82

《黑神话&#xff1a;悟空》媒体评分现已解禁&#xff0c;截止发稿时&#xff0c;M站共有43家媒体评测&#xff0c;均分为82分。 部分媒体评测&#xff1a; God is a Geek 100&#xff1a; 毫无疑问&#xff0c;《黑神话&#xff1a;悟空》是今年最好的动作游戏之一&#xff…

linux系统安装mysql服务

linux系统安装mysql服务 1.下载安装包2.下载压缩文件解压安装3. 安装完启动服务4.查看安装密码5.使用上述密码登录6.修改密码7.创建一个root可以在任意主机远程连接数据库8.远程登录成功 1.下载安装包 https://downloads.mysql.com/archives/community/ mysql下载地址 2.下载…

【AI安防】YOLOv8 + OpenVINO2023 + QT5 电子围栏预警系统

引言 电子围栏是一种利用无线通信技术和地理信息系统实现的虚拟边界&#xff0c;用于监控和控制被监控对象的位置。它可以帮助我们实现对特定区域内的自定义对象进行实时检测、定位与跟踪。本文介绍了一种基于YOLOv8 OpenVINO2023 QT5 联合打造的实时高效、多线程、自定义对…

Keepalived简介以及常见用途

一、Keepalived 简介 Keepalived 是一个高可用性&#xff08;HA&#xff09;解决方案&#xff0c;主要用于实现 Linux 系统的负载均衡和故障转移。它最初设计用于与 LVS&#xff08;Linux Virtual Server&#xff09;一起使用&#xff0c;但也可以独立使用&#xff0c;主要功能…

0815,析构函数,拷贝构造函数,赋值运算符函数

来自同济医院的问候 目录 01&#xff1a;对象创建 001.cc 003size.cc 02&#xff1a;对象销毁 004pointer.cc 005destroytime.cc 03&#xff1a;本类型对象的复制 3.1 拷贝构造函数 006cp.cc 007cptime.cc 008recursion.cc 009rightleft.cc 3.2 赋值运算符函数 …

8.15 Day20 Windows服务器(Windows service 2008 R2)上域的搭建 (3)

1、域策略配置 1.1 DC服务端的策略配置 1.1.1 下放权限 由于各部门经理的电脑上并不存在对应的工具&#xff0c;即便授予权限也无法对各自部门进行管理 如果经理只有几个&#xff0c;管理员可以一一为其配置&#xff0c;但如果一个公司有几十个经理&#xff0c;则会变得相当冗…

测试用例的设计

*涉及概念来源于《软件测试的艺术》 目录 一、为什么要设计测试用例&#xff1f; 二、黑盒测试与白盒测试介绍 三、测试用例常见设计方法 1.黑盒测试(功能测试) 2.白盒测试(结构测试) 四、测试策略 五、测试用例怎么写 一、为什么要设计测试用例&#xff1f; 由于时间…

C语言传递指针给函数

C 语言允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值 实例1&#xff1a;获取系统的时间值 能接受指针作为参数的函数&#xff0c;也能接受数…