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

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

项目简介:

模拟了高并发场景的商城系统,它具备秒杀功能,为了解决秒杀场景下的高并发问题。引入了 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.mzph.cn/news/596045.shtml

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

相关文章

新年话节能 电梯也减排

小伍恭祝大家2024年元旦快乐!! 目前,电梯的节能已经得到业界的广泛重视,积极推动相关的节能技术的实施,努力宣传和倡导规范的电梯的使用行为,将极大地改变我国电梯的耗能状况,为节能减排做出较大…

遥测终端机:数据世界的千里眼与顺风耳

在当今这个信息爆炸的时代,数据的重要性日益凸显。如何高效、准确地收集、传输和处理这些数据,成为了众多企业和研究机构关注的焦点。而遥测终端机,正是这样一种解决这一问题的强大工具。 遥测终端机,顾名思义,是一种…

JavaScript 基础(一)

实验需新建一个 test.html 文件&#xff0c;用于编写代码。后续的例子中&#xff0c;将不再提醒建立文件&#xff0c;大家根据个人需求自行创建对应的 html 文件&#xff0c;并完成代码练习&#xff1a; 首先来看看范例代码&#xff1a; <!doctype html> <html>&…

OpenAI API/Plus会员信用卡绑定付款方式经历

前言 9月25日起ChatGPT风控升级&#xff0c;428813的卡只可以支付Open ai API-key&#xff0c;直接订阅plus会被拒。部分用户将卡绑定美区Google pay使用app store进行订阅可以成功&#xff0c;如果您没有这两种支付方式&#xff0c;请您重新开一张534786的万事达美卡升级订阅…

光伏效果图是用什么软件建模设计的?

光伏效果图是展示光伏系统在建筑或地面上的外观和效果的图像。要创建这样的效果图&#xff0c;需要使用专业的建模和设计软件。那么&#xff0c;光伏效果图是用什么软件建模设计的呢&#xff1f; 鹧鸪云光伏设计软件&#xff1a;鹧鸪云是一款集开发、设计和施工为一体的设计软…

2023年终总结|回顾学习Tensorflow、Keras的历程

2023年4月&#xff0c;初探TensorFlow2.0&#xff0c;对比了1.0版本的差异。接着&#xff0c;学习了TensorFlow2.0的常量矩阵、四则运算以及常用函数。学习了数据切割、张量梯度计算、遍历元素、类别索引转换等技巧&#xff0c;并掌握了CNN输出特征图形状的计算方法。 在数据处…

kafka消息队列安装以及整合springboot使用

文章目录 一、JMS与AMQP二、安装2.1 Java安装2.2 Zookeeper 和 kafka安装2.3 docker-compose 安装【待定&#xff0c;远程连接可能连接不上】 三、Kafka数据存储流程和原理概述和LEOHW讲解四、代码客户端连接kafka五、**ProducerRecord和key的作用**5.1 **如果保证顺序消费&…

cnstd使用效果测试

使用参考&#xff1a;https://github.com/breezedeus/CnSTD/tree/master 原理参考&#xff1a;https://cnocr.readthedocs.io/zh/latest/intro-cnstd-cnocr.pdf 模型&#xff1a; 结论&#xff1a; 经过测试&#xff0c; 长文本检测效果不错&#xff0c;短文本可能角度不对 …

【Harmony OS - 网络请求】

在一个应用开发中&#xff0c;网络请求是必不可少的&#xff0c;我们一般用的fetch、axios来进行http请求&#xff0c;在鸿蒙中也可以通过createHppt来发生一个http请求&#xff0c;它们都是异步请求返回的Promise&#xff0c;下面我们将介绍’ohos.net.http’和axios这两种方式…

学而时习之---状态模式

在软件系统中&#xff0c;有些对象也像水一样具有多种状态&#xff0c; 这些状态在某些情况下能够相互转换&#xff0c; 而且对象在不同的状态下具有不同的行为。 为了更好地对这些具有多种状态的对象进行设计。 使用一种被称为状态模式的设计模式。 状态模式用于解决系统中复…

[DevOps-05] Jenkins实现CI/CD操作

一、简要说明 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 二、准备Springboot工程 1、IDEA新建工程 2、填写项目工程信息 3、选择Springboot版本…

不要盲目自学网络安全!学习顺序特别重要!

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

中国植被分区数据,shp数据,2000年,字段包含区域代码、名称、地带代码及名称,附高清图可视化

数据名称: 中国植被分区数据 数据格式: Shp 数据时间: 2000年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1zbqydm植被区域代码2zbqymc植被区域名称3zbdddm植被地带代码4zbddmc植被地带名称 …

接口和抽象类有什么共同点和区别?

共同点&#xff1a; 都不能被实例化。都可以包含抽象方法。都可以有默认实现的方法&#xff08;Java 8 可以用 default 关键字在接口中定义默认方法&#xff09;。 区别&#xff1a; 接口主要用于对类的行为进行约束&#xff0c;你实现了某个接口就具有了对应的行为。抽象类…

Vue中的选项式 API 和组合式 API,两者有什么区别

Vue中的选项式 API&#xff08;Option API&#xff09;和组合式 API&#xff08;Composition API&#xff09;是两种不同的组件编写方式&#xff0c;它们各有特点和适用场景&#xff1a; 选项式 API&#xff08;Option API&#xff09;: 传统方法&#xff1a;Vue最初的编程范式…

天洑智能设计全系列产品完成银河麒麟操作系统适配!

近日&#xff0c;天洑软件智能设计全系列产品&#xff08;智能热流体仿真软件AICFD、智能结构仿真软件AIFEM、智能优化软件AIPOD、智能数据建模软件DTEmpower&#xff09;已成功完成银河麒麟桌面操作系统V10的适配工作。双方产品完全兼容&#xff0c;运行稳定、安全可靠、性能优…

freeRTOS——事件标志组知识总结及实战

1事件标志组概念 事件标志组&#xff1a;是一组事件标志位的集合&#xff0c; 可以简单的理解事件标志组&#xff0c;就是一个整数。 其特点&#xff1a; 1&#xff09;它的每一个位表示一个事件&#xff08;高8位不算&#xff09; 2&#xff09;每一位事件的含义&#xff0c;…

创建企业邮箱帐户指南:常见问题与解决方法分享

专业的电子邮件地址可以帮助客户识别商务人士&#xff0c;并了解公司给他们发邮件的目的。如果你从事管理、信息技术或人力资源工作&#xff0c;你可能会负责为一个企业建立一个企业邮箱帐户。了解如何为新员工和现有员工设置电子邮件帐户可以帮助您简化公司内部的沟通。 在这篇…

关于户口本等户籍材料翻译

户籍材料&#xff0c;作为证明公民户籍与身份的关键文件&#xff0c;在每个实施户籍制度的国家中均不可或缺。它们不仅是登记、变更或注销户籍的依据&#xff0c;更是多种生活场景中不可或缺的证明。举例来说&#xff0c;一个在国外出生的孩子若想在中国落户&#xff0c;就必须…

LN和BN

假设batch为2&#xff0c;&#xff08;2&#xff0c;3&#xff0c;256&#xff0c;256&#xff09;这样的样本 LN比较直观就是在每个独立的样本上计算均值和方差&#xff0c;然后归一化。&#xff08;2&#xff0c;3&#xff0c;256&#xff0c;256&#xff09; 归一化是将数…