【springboot项目】之秒杀项目常见问题(Seckill)

news2025/5/31 22:01:32

秒杀问题分为两部分:用户查看商品详情页、用户下单

项目简介:

模拟了高并发场景的商城系统,它具备秒杀功能,为了解决秒杀场景下的高并发问题。引入了 redis 作为缓存中间件,1.主要作用是缓存预热、预减库存等等。2.针对高并发场景进行了页面优化,缓存页面至浏览器,前后端分离降低服务器压力,加快用户访问速度。

先不答:在安全性问题上,我使用双重MD5密码校验,隐藏了秒杀接口地址,设置了接口限流防刷。

最后还使用数学公式验证码不仅可以防恶意刷访问,还起到了削峰的作用。通过 Jmeter 压力 测试 ,系统的QPS从150/s提升到2000/s。

QPS:【Queries-per-second】每秒处理事务数(每秒查询率)

一、查看商品详情页

1.初始化流程图

介绍:若redis中有数据就把数据返回到前端,若没有数据则请求数据库;

一条查询操作,在service层首先走Redis,若命中直接返回,否则去底层数据库中查,查询到了,返回给service层,并将查询结果保存在redis中,后返回给Controller

问:有无更快一点的方法?

利用多级缓存:查询redis会有网络请求,所以会产生一些i/o带宽的浪费,所以可以考虑把热点数据存储到jvm内存中去(热点数据:基本不变的数据),此时前端请求直接走jvm,没有一些I/O读写的操作,所以速度就会变快一些;若jvm内存中没有数据,再去redis中去查,redis中没有再去数据库查。

注意:但是jvm的内存是非常宝贵的,所以我们只存放非常热点的数据,不经常容易变的数据;

## 更新后的流程图:

image-20220722185625155
问:jvm并发有限,比如要抗住10万并发量怎么办?

答:1.利用服务器集群,比如我们一个机器可以抗住1w并发,那么我就可以利用10个机器去解决10万并发的问题;用Nginx来做负载均衡:用上一些轮询算法等(左图所示);**2.**还可以利用缓存来解决,我们把这个缓存放在距离用户最近的地方(这样子系统就会很快,用户体验也会很好),从目前这个流程图看,Nginx是距离用户最近的地方,所以我们可以用Nginx去访问这个redis(下两个图所示)
在这里插入图片描述

关于优化的问题

问:如商品详情页会有很多静态资源,这些静态资源怎么处理?

答:商品详情页有很多静态资源:比如我们写好的css,jss,html等,若去服务器上请求会浪费性能,这个时候我们可以把这个静态资源缓存到这个CDN上面,然后浏览器就可以直接去CDN上取这个静态资源,此时速度就会提升很多;

关于CDN:cdn优化的是用户访问静态资源的速度;

问:但是页面上显示的数据还得去后端接口查询出来,而我又不想去后端接口查询数据,如何处理?

答:在后端把页面完全静态化,然后把整个这个静态化好的资源放到CDN上面去,浏览器直接请求CDN上的详情页就可以直接显示了;

再问:那什么是页面静态化呢?

答:后端数据实时得渲染到前端页面上,才能显示不同的页面数据;因为有些商品详情的信息是基本不会发生改变的,页面静态化就是提前把这个数据渲染到页面上,然后把页面提供给用户访问。

二、秒杀下单

在活动开始之前,提前先把这个商品的库存缓存到redis中去,在redis里面进行一个预减库存的操作。(因为高并发下修改数据库的数据,会引发锁竞争);这样的话就不用频繁的去修改数据库中的数据,也就有效减少了锁竞争的问题

问:接上:那你是如何保证这个redis和数据库的数据一致性呢?

答:我们在redis和数据库之间加上MQ,用mq异步的方式同步这个信息。也就是说:扣减库存的操作在redis里面执行,然后把扣减库存的信息告诉MQ,然后MQ再通知MySQL扣减了多少库存;

队列排队下单

问:两个小问题
①mysql消费mq失败怎么办?②在数据库中创建订单失败了怎么办?

答:我们可以利用分布式事务来解决一下,如MQ中的rocket mq去解决;(因为rockt mq对事务比较友好)

问:那么不用mq,且redis挂了怎么办?

答:----(暂未写好答案)

问:一千万人秒杀商品,但是库存只有100w件怎么办?其余的人还在不断地请求我们的系统,这样子好吗?
做了什么流量削峰的措施?秒杀令牌

答:首先这样子肯定不好,一个是对系统的性能有影响,再一个就是用户的体验性不好;

如何解决:我么可以添加一个秒杀令牌的概念,但凡是想要参加这个秒杀活动的用户,必须先获得这个秒杀令牌(类似于活动入场券,有了入场券才能参加活动),我们在用户进行秒杀之前先判断他有无这个令牌,有令牌的则让进来进行秒杀;并且这个令牌的数量是有限的,当我们令牌发放完毕,我们就不让其他用户在继续请求我们的后端接口,直接拒绝用户的请求,减少系统资源的消耗和压力;

我们可以设置为库存量的5倍,500w个令牌;也就是说500万用户来抢夺这个100w件商品;我们不能把令牌的数量设置=库存数量,是因为有很多用户抢到了商品,但是最后还是没有付款,所以设置的多一些,可以让其他想要买的用户去抢;

还可以作为优化的地方:

1.限流操作

同时因为我们秒杀的商品种类不止一件,所以我们虽然设置了令牌机制,但是我们的秒杀流量依然很大,所以我们要进行一些限流的操作,如下图,我们在后端接口上用jmeter做后端系统的压测;比如我们这个秒杀的接口最多只能承受1w的并发,我们就要限流,比如限流8000,限流的好处就是防止系统被压垮,使得系统可以继续对外提供服务;

2.队列泄洪

接口里面进行一个队列泄洪操作;

因为在我们的接口里,会有大量的线程进来,去竞争创建订单,也就是说同时竞争这个cpu资源;而Redis是单线程的(redis是单线程的,是非常快的,因为没有cpu的上下文切换和i/o的多路复用);假使我们的cpu同时只能处理100个请求,而此时已经进来10000个线程来竞争cpu,此时的话会产生很多的性能消耗;

所以我们可以考虑把这10000个线程放在一个队列里面,然后让cpu从队列里面进行消费线程,一次只拿100个,执行完以后再从队列里面取100个,这样子cpu能处理的线程数和我们提供的线程数相等,此时就不会产生一个竞争问题。

3.熔断机制

利用熔断降级的逻辑保护系统,防止意外的大量的请求压垮系统,从而造成整个系统的瘫痪;

具体介绍:当出现系统无法承受的流量时候,我们利用熔断暂时先把请求全部拒绝,等到系统慢慢恢复再重新打开;

当熔断出现后,我们拒绝其他的请求,只剩下一小部分请求过来,看系统是否可以响应,等到系统恢复完全,我们再把接口全部开放;

同时配合这个降级的逻辑,也就是说,拒绝用户请求的同时返回一个友好提示:如,系统繁忙,请稍后再试

4.再者我们进行分布式服务,把服务横向扩展,让更多的独立的服务器去扛这个高并发

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

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

相关文章

简易五子棋的实现(C++)

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder) 目录 一、效果图二、代码(带注释)三、说明 一、效果图 二、代码(带…

获取CNN/DM适用于评估Bart的格式的数据集(类似于test.source、test.source.tokenized)

项目场景: 复现文本摘要任务评估CNN/DM数据集 问题描述 abisee老哥的代码获取的是bin格式的数据集 时间久远,一些依赖的配置版本难以复现 笔者需要能评估Bart 格式的数据集 形式类似于test.source、test.source.tokenized 解决方案: 经过坚…

确定转角起始扭矩值的方法有哪些

在预紧螺栓时,扭矩加角度法是一种常用的方法。这种方法需要确定转角起始扭矩值,以确保螺栓能够被正确地预紧。确定转角起始扭矩值的方法如下,SunTorque智能扭矩系统带大家一起了解。1. 确定螺栓规格和性能参数 在预紧螺栓之前,需要…

odoo17 | 模型之间的关系

前言 上一章介绍了自定义的创建 包含基本字段的模型的视图。但是,在任何实际业务场景中,我们需要的不仅仅是 一个模型。此外,模型之间的链接是必要的。人们可以很容易地想象一个模型包含 客户和另一个包含用户列表的客户。您可能需要推荐客户…

分布式图文详解!

分布式理论 1. 说说CAP原则? CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这3个基本…

进程的韵律:探索计算机世界中的动态舞台

这里写目录标题 进程定义进程的组成进程与程序区别进程与线程区别进程特点进程控制结尾 进程定义 进程:一个具有一定功能的程序在一个数据集合上的一次动态执行过程。 进程是指正在运行的程序,它是操作系统进行资源分配和调度的基本单位。在计算机中&…

【安装pybluez】报错解决python setup.py egg_info did not run successfully.

python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [1 lines of output] error in PyBluez setup command: use_2to3 is invalid. [end of output] Preparing metadata (setup.py) … error error: subprocess-exited-with-error python setup.p…

SpringBoot连接MySQL并整合MyBatis-Plus

SpringBoot连接MySQL并整合MyBatis-Plus 配置springboot版本目录结构pom.xml文件application.yml数据库表代码Test.javaTestMapper.javaTestMapper.xmlTestService.javaTestServiceImpl.javaTestController.java效果配置 springboot版本 <parent><groupId>org.sp…

【面试高频算法解析】算法练习2 回溯

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯双指针滑动窗口深度优先搜索…

JavaScript高级程序设计读书记录(二):语言基础,操作符,语句,函数

4. 操作符 4.1 一元操作符 只操作一个值的操作符叫一元操作符&#xff08;unary operator&#xff09;。一元操作符是 ECMAScript中最简单的操作符。 1. 递增/递减操作符 递增和递减操作符-- 直接照搬自 C 语言&#xff0c;但有两个版本&#xff1a;前缀版和后缀版。 无论使…

使用KVM命令集管理虚拟机

1、KVM基本功能管理 1&#xff09;查看命令帮助 [rootlocalhost ~]# virsh -h ......//省略输出内容 2&#xff09;查看KVM的配置文件存放目录&#xff08;rhel7.1是虚拟机系统实例的配置文件&#xff09; [rootlocalhost ~]# ls /etc/libvirt/qemu autostart networks r…

Spark内核解析-脚本解析2(六)

2、脚本解析 在看源码之前&#xff0c;我们一般会看相关脚本了解其初始化信息以及Bootstrap类&#xff0c;Spark也不例外&#xff0c;而Spark中相关的脚本如下&#xff1a; %SPARK_HOME%/sbin/start-master.sh %SPARK_HOME%/sbin/start-slaves.sh %SPARK_HOME%/sbin/start-all…

SQL中 Group by Grouping Sets 分组的用法

文章目录 1. 用法2. 语法3. 实际应用3.1 求总和与小计3.2 按多个维度分组3.3 标记小计和总计 1. 用法 将Grouping Sets 运算符添加到Group by 子句中&#xff0c;使用Grouping Set 可以在一个查询中指定数据的多个分组&#xff0c;其结果与针对指定的组执行union all 运算等效…

《设计模式》之策略模式

策略模式定义 比如对象的某个行为&#xff0c;在不同场景有不同实现方式&#xff0c;可以将这些行为的具体实现定义为一组策略&#xff0c;每个实现类实现种策略&#xff0c;在不同场景使用不同的实现&#xff0c;并且可以自由切换策略。 策略模式结构 策略模式需要一个策略…

SpringBoot的测试

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

【iOS安全】JS 调用Objective-C中WKWebview Handler的三种方式

有三种实现途径 1. WKScriptMessageHandler OC部分&#xff1a;注册并实现Handler 将OC中的方法"nativeMethod"注册为JavaScript Message Handler&#xff0c;从而WebView中的JavaScript代码可以调用该方法 // Register in Objective-C code - (void)setupWKWebVi…

table的最后一行需要加底色

<tr class"font12" v-for"(item, index) in OrderAuditDiscountList.list" :key"index":class"OrderAuditDiscountList.list.length - 1 index ? blodfont : "> 其中&#xff1a; :class"OrderAuditDiscountList.list.le…

分布式锁Lock4J 使用总结

Lok4j 简介 lock4j是一个分布式锁组件&#xff0c;其提供了多种不同的支持以满足不同性能和环境的需求。 立志打造一个简单但富有内涵的分布式锁组件。 特点 简单易用&#xff0c;功能强大&#xff0c;扩展性强。支持redission,redisTemplate,zookeeper。可混用&#xff0c…

羊大师讲解,羊奶为什么更适合高血压人群?

羊大师讲解&#xff0c;羊奶为什么更适合高血压人群&#xff1f; 高血压是一种常见的健康问题&#xff0c;它会引起诸多并发症并增加心脑血管疾病的风险。与此同时&#xff0c;人们越来越关注饮食对健康的影响。作为一种营养丰富且适合高血压人群的饮品&#xff0c;羊奶备受关…

Java版直播商城免 费 搭 建:平台规划与常见营销模式,电商源码、小程序、三级分销及详解

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…