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

这篇具有很好参考价值的文章主要介绍了关于秒杀系统的一系列问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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等,以及有阻塞队列,有界无界的,链表形式的等等。文章来源地址https://www.toymoban.com/news/detail-428197.html

到了这里,关于关于秒杀系统的一系列问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java系列】多线程案例学习——基于阻塞队列实现生产者消费者模型

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得,欢迎大家在评论区交流讨论💌 什么是阻塞式队列(有两点): 第一点:当队列满的时候

    2024年02月04日
    浏览(52)
  • 【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列

    目录 1、单例模式 1.1、饿汉模式 2.1、懒汉模式  2、阻塞队列 2.1、BlockingQueue 阻塞队列数据结构 对框架和设计模式的简单理解就是,这两者都是“大佬”设计出来的,让即使是一个代码写的不太好的“菜鸡程序员”也能写出还可以的代码。 设计模式也可以认为是对编程语言语

    2024年03月23日
    浏览(90)
  • 前端请求队列,解决多个请求同时请求一个接口导致阻塞的问题

    最近开发的数据大屏项目,使用echarts图表,通过拖拽的方式完成大屏的布局。 每一个图表编写一个vue文件,例如柱状图(barChart.vue): queryEchartsData的方法体如下: 折线图等其他图表同理,都是使用queryEchartsData来获取后端接口返回的数据,queryEchartsData写在queryData.js中,然后

    2024年01月20日
    浏览(43)
  • MySQL数据库关于表的一系列操作

    varchar 动态字符串类型(最长255位),可以根据实际长度来动态分配空间,例如:varchar(100) char 定长字符串(最长255位),存储空间是固定的,例如:char(10) int 整数型(最长11位) long 长整型 float 单精度 double 双精度 date 短日期,只包括年月日 datetime 长日期,包括年月日时分

    2024年02月15日
    浏览(41)
  • Elastic认证含金量高吗?关于Elastic认证考试的一系列解惑

    不到半年时间,我已经带领了社区近百位“勇士”通过了 Elastic认证考试 。几乎每周都有至少 2 ~ 3 位勇士拿到 Elastic认证工程师 的认证证书。每一位的证书都可在社区星球查看。这一张张的证书,表面上是一股荣耀。背后却充满了各种各样的感人故事和辛酸历程。 半年的时

    2024年02月04日
    浏览(55)
  • 关于recv、recvfrom的阻塞所遇到的问题(MSG_DONTWAIT)

    近期,在做网络通信时,需要开发出一个应用程序来随时更改转发的目标地址,并同时要一直接收别的主机发来的命令从而进行一系列操作。由于之前没有做过windows系统下的窗口程序开发,我开始一点一点学习怎么创建窗口,当应用界面大概成功的时候,出现了一个问题。就

    2024年02月10日
    浏览(29)
  • 安装fasttext的一系列问题(全)

    环境配置:windows10+python3.10 前言:Gensim中的fasttext不能做文本分类,对于想学习fasttext进行文本分类、情感分析的同学还是必须下载Facebook的fasttext 在该python libs (或者粘贴该链接https://www.lfd.uci.edu/~gohlke/pythonlibs/#fasttext)搜索fasttext 下载whl文件,文件名: fasttext-0.9.2-cp310-cp31

    2024年02月06日
    浏览(56)
  • FreeRTOS在Cortex-M系列内核中遇到的关于系统滴答中断的问题

    众所周知,在Cortex-M内核中,系统节拍由Systick时钟提供,当配置好系统滴答时钟后,每次时钟中断就会触发中断处理函数 xPortSysTickHandler(),   这部分主要是依靠  xTaskIncrementTick(), 来判断任务切换是否在此次系统时钟中断时被需要。如果是,则PendSV标记置位,等待触发PendS

    2024年02月08日
    浏览(44)
  • 秒杀系统常见问题—库存超卖

    大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是正文! 首先上一串代码 我们看一下这串代码,逻辑用流程图表示如下: 从图上看,逻辑还是很清晰明了

    2024年02月06日
    浏览(52)
  • Mybatis引出的一系列问题-动态 SQL

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。 使用动态 SQL 最常见情

    2024年02月14日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包