关于秒杀系统的一系列问题

news2025/1/20 1:03:08

阻塞队列怎么么实现?超卖问题?整体怎么实现?

5 设计一个秒杀系统
特点:高并发,请求量远大于库存量,只有少数能成功;逻辑比较简单,下单减库存;
设计理念:**限流,**只有少部分流量能进入后端;削峰,将瞬间的高流量转换成平稳的流量(比如异步处理)。内存缓存:秒杀系统最大的瓶颈一般都是数据库读写,由于数据库读写属于磁盘IO,性能很低,如果能够把部分数据或业务逻辑转移到内存缓存,效率会有极大地提升。分布式处理。
流程:前端秒杀界面-服务端控制器(网关)-服务层-数据库层
前端浏览器可做的:将页面能静态的元素都用静态(静态不涉及服务端),通过CDN对抗峰值;禁止重复提交:用户提交之后按钮置灰,禁止重复提交;用户限流:在某一时间段内只允许用户提交一次请求,比如可以采取IP限流。
服务端控制器层(网关层)
限制uid(UserID)访问频率:我们上面拦截了浏览器访问的请求,但针对某些恶意攻击或其它插件,在服务端控制层需要针对同一个访问uid,限制访问频率。

服务层
1、采用消息队列缓存请求:既然服务层知道库存只有100台手机,那完全没有必要把100W个请求都传递到数据库啊,那么可以先把这些请求都写到消息队列缓存一下,数据库层订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。
2、利用缓存应对读请求:对类似于12306等购票业务,是典型的读多写少业务,大部分请求是查询请求,所以可以利用缓存分担数据库压力。
3、**利用缓存应对写请求:**缓存也是可以应对写请求的,比如我们就可以把数据库中的库存数据转移到Redis缓存中,所有减库存操作都在Redis中进行,然后再通过后台进程把Redis中的用户秒杀请求同步到数据库中。(redis就是非关系数据库,可以在内存处理数据,读写比较快)
秒杀系统特点是并发量极大,但实际秒杀成功的请求数量却很少,所以如果不在前端拦截很可能造成数据库读写锁冲突,甚至导致死锁,最终请求超时。

在这里插入图片描述
总结:秒杀系统特点是瞬间高并发峰值。
第一就是前端限流
比如按钮只能点一次,IP限流;
比如静态页面,用户浏览商品等常规操作,并不会请求到服务端。只有到了秒杀时间点,并且用户主动点了秒杀按钮才允许访问服务端。
比如使用CDN,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
比如提高参加的门槛,会员才能参加;比如分批抢,这些都是产品经理的问题了,不算技术问题。
第二点:由于只有少部分商品,所以大部分用户都是返回失败,下单成功才会写库存。是典型的读多写少的场景,该用缓存了。
针对读多写少场景,大量读请求可能会击沉数据库,所以可以用缓存比如redis。可能会遇到缓存击穿(热点数据永不过期,加锁),穿透(接口校验,布隆过滤器,返回固定值并写缓存),雪崩(过期时间打散)等问题要注意解决。更多的话可以用redis集群,以及涉及集群的一些问题。

第三点就是针对库存问题。
比如真正的秒杀商品的场景,不是说扣完库存,就完事了,如果用户在一段时间内,还没完成支付,扣减的库存是要加回去的。所以,在这里引出了一个预扣库存的概念
以及库存超卖问题?我们在减库存一般先检查库存量是否大于0,是的话就执行减库存,但是这两个操作不是原子操作,所以很有可能检查大于0,但是在减库存之前被别的用户买完了。
解决方法可以是加互斥锁,这样就不会出现多个线程访问同一个共享变量的情况。但是性能太低了。

**乐观锁:用CAS,版本号解决,适用于读多写少的场景。**效率高一点。

在这里插入图片描述真正并发量大的是秒杀功能,下单和支付功能实际并发量很小。所以,我们在设计秒杀系统时,有必要把下单和支付功能从秒杀的主流程中拆分出来,特别是下单功能要做成mq异步处理的。
如果使用mq,需要关注以下几个问题:
消息丢失问题:原因有很多,比如:网络问题、broker挂了、mq服务端磁盘问题等(解决思路,消费前,先写入消息表,转态为待处理,只有成功消费,回调函数修改状态为已处理,每隔一段时间检查消息表,待处理就重试)
重复消费:本来消费者消费消息时,在ack应答的时候,如果网络超时,本身就可能会消费重复的消息。但由于消息发送者增加了重试机制,会导致消费者重复消息的概率增大。那么,如何解决重复消息问题呢?(加一张消息处理表,先判断表里有没有,有就直接返回,没有就下单并且加入到处理表,要保证原子操作)

(总结:前端限流(按钮,ip,CDN) 读多写少加缓存(缓存相关问题),库存超卖问题解决(乐观锁悲观锁),消息队列异步处理下单支付操作(削峰)消费丢失重复问题)

消息队列有哪些实现形式?

消息队列的作用:解耦,异步,削峰。
解耦就是生产者和很多消费者解耦,A只需要把消息写到队列中,不关心谁用,消费者挂了或者超时都跟A无关。
异步削峰:比如A是主要压力业务也就是秒杀,而下单支付都是次要业务,如果一次要搞完就会让主要业务延迟太久,锁争用太多,崩溃,队列先暂存秒杀成功,其他的次要任务不急着实现。

有成熟的rabitMQ,kafka等,以及有阻塞队列,有界无界的,链表形式的等等。

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

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

相关文章

ESP8266基于Lua开发点灯示例

ESP8266基于Lua开发点灯示例 ✨基于ESPlorer IDE:https://github.com/4refr0nt/ESPlorer/releases🔧固件烧录工具:NodeMCU-PyFlasher🌿esp8266烧录工具下载:https://github.com/marcelstoer/nodemcu-pyflasher/release…

LabVIEW CompactRIO 开发指南2 CompactRIO软件架构

第一章 CompactRIO软件架构 几乎所有的CompactRIO系统都至少有三个顶层VIs在三个不同的目标上异步执行:FPGA、实时操作系统(RTOS)和主机PC。如果开始软件开发时没有某种架构或流程图可供参考,那么可能会发现跟踪所有软件组件和通信路径是具有挑战性的。拥有一个在…

CentOS7上使用yum搭建LNMP架构并实现wordpress博客实战

前言 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家😉😉 💕 座右铭: 先努力成长自己,再帮助更多的人 &#xff0c…

魔兽worldserver.conf 服务端配置文件说明

魔兽worldserver.conf 服务端配置文件说明 我是艾西,今天把很多小伙伴需要的魔兽worldserver.conf 服务端配置文件说明分享给大家,大家可以自己研究参考下 worldserver.conf 这个文件是服务端的配置文件,可以在这里做很多个性化修改 注意&a…

SpringSecurity跌坑指南

SpringSecurity跌坑指南 1,事情原委 这两天开始了毕业设计,但是突然发现自己的java方面的基础比较薄弱,于是决定自己从头到尾的开发一个java项目 要说跌的最惨的坑,莫过于springsecurity,如果你只是想要在项目里面配…

〖ChatGPT实践指南 - 零基础扫盲篇⑦〗- 基于 Python 实现的 OpenAI-Library 的简单使用

文章目录 ⭐ python 安装 OpenAI library⭐ 创建 openai.py 进行测试⭐ openai.Completion.create() 方法的小拓展 该章节我们呢来学习一下 OpenAI-Library 的使用,OpenAI-Library 是 OpenAI 官方给我们提供的各种开发语言的库,供我们使用。在前面的章节…

【无标题】基于matlab的长短期神经网络lstm的股票预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的股票预测 MATALB编程实现,附有代码 效果图 结果分析 展望 参考论文 背影 股票市场的波动十分巨大,由于一些不确定因素的影响,导致很难对股票进行投资盈利。因此&…

数据库 SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正确 解决方法

目录 一、错误提示信息: 二、原因分析: 三、解决方法: 四、执行完成结果: 五、重要说明 一、错误提示信息: 本文验证是数据库中的baiduAi_0258表无法通过select语句ID条件查询, 如执行 select * fro…

远程桌面,openGL

x11、xserver看另一篇博客 openGL是一种规范,用于绘制图像 OpenGL是Khronos Group开发维护的一个规范(也就是提供了一种接口),它主要为我们定义了用来操作图形和图片的一系列函数的API,需要注意的是OpenGL本身并非API。…

vscode 配置有误导致的一次Linux 崩溃

一、问题描述 1. 要实现的功能 编写一个Linux 按键驱动,按下按键时,产生中断,在中断中启动定时器进行防抖处理。 2. 出现的问题 在中断处理函数中,调用 add_timer 函数设置定时器超时函数,并启动定时器。编写完驱动…

【消息队列】Apache Pulsar存储计算分离

前言 对于一个互联网项目来说,一般除了在语言层面的技术选型外,也会引入各种中间件,比如缓存、消息队列、搜索、NoSQL等,但是跳出语言层面来看的话,其实我们庖丁解牛之后,每个中间件都解决了特定的问题。 …

计组 作业九

作业9 题量: 36 满分: 100 作答时间:04-27 10:56至05-10 23:59 89.5分 一. 单选题(共18题,39分) 1. (单选题, 2分)Intel80486是32位微处理器,Core是______位微处理器。 A. 16B. 32C. 48D. 64 我的答案…

20.网络爬虫—Scrapy-Redis分布式爬虫

网络爬虫—Scrapy-redis详讲 Redis的安装与使用分布式概念和作用分布式爬虫分布式爬虫特点redis的使用Redis 操作/启动 Redis Desktop Manager下载特点和架构安装和使用Scrapy-redis 代码部署spider文件 settings文件 前言: 🏘️🏘️个人简介…

wsl2使用open3d等进行图像绘制

在~/.bashrc文件中添加两个环境变量 export DISPLAY"grep nameserver /etc/resolv.conf | sed s/nameserver //:0" export LIBGL_ALWAYS_INDIRECT0 第一行是让wsl将openGL命令(图形绘制命令)输出到哪里,也就是x-server的位置&…

【Linux】指令(上)

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:Linux ⭐代码仓库:Linux 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…

机器学习在生态、环境经济学中的应用及论文写作

近年来,人工智能领域已经取得突破性进展,对经济社会各个领域都产生了重大影响,结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一,目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…

08_ThreadPool线程池

1. 架构说明 Java中的线程池是通过Executor框架实现的,该框架中用到了Executor,ExecutorService,ThreadPoolExecutor这几个类。 Executor接口是顶层接口,只有一个execute方法,过于简单。通常不使用它,而是…

什么是shell脚本和简单shell脚本练习

文章目录 什么是shell脚本和简单shell脚本练习什么是shell脚本为什么要学习shell脚本第一个脚本编写与执行编写第一个脚本 简单的shell脚本练习简单案例交互式脚本:变量内容由用户决定随日期变化:利用date建立文件数值运算:简单的加减乘除数值…

java内存占用过大分析,mat内存快照分析

背景 最近功能模块上线后,生产内存占用显著提升,查看gc日志发现年轻代频繁从2G回收到60M左右,猜测是在方法中频繁创建大对象导致,由于一时间无法通过review代码找出问题所在,只好将生产jvm内存快照dump后通过java mem…

Zotero+坚果云打造多设备同步的文献管理工具(保姆级教程)

Zotero坚果云打造多设备同步的文献管理工具(保姆级教程) 文章目录 Zotero坚果云打造多设备同步的文献管理工具(保姆级教程)Zotero介绍所需软件或插件实现方式步骤1:坚果云配置步骤2:Zotero配置步骤3&#x…