如何设计一个能抗高并发的秒杀场景(代码片段)

wen-pan wen-pan     2023-01-23     497

关键词:

说明:秒杀场景中有许多需要考虑的问题,这里只是将如何设计一个能抗高并发的秒杀设计的主流程进行分析!!!

一、秒杀的特点

  • 商品库存总量固定
  • 先到先得,瞬时并发极大
  • 商品数量和库存数量有限

二、如何设计秒杀场景

1. 秒杀开始前先将秒杀的商品和对应的库存预热到Redis中(商品code : 对应的库存)
2. 秒杀开始,大量用户开始点击按钮进行秒杀
3. NGINX对用户请求进行过滤,通过执行lua脚本去Redis中扣减对应商品的库存(预减库存)

  1. 如果库存扣减成功则继续放行请求到网关
  2. 如果扣减库存失败,则直接返回个前端秒杀失败的响应

4 .网关将请求转发到后台的应用服务
5. 应用服务收到请求后,根据请求中的商品id和用户信息生成一个秒杀消息并将消息投递到MQ中
6. 订单服务去订阅MQ中这个队列,将秒杀消息取出
7. 根据秒杀消息生成一条订单信息存入到MySQL数据库,到这里订单生成就完毕了
8. 秒杀成的客户端需要提供一个定时查询订单状态的功能,一旦订单生成成功了,则客户端就可以点击查看订单详情,然后去支付了

三、设计上的优点

  • 利用预减库存方案杜绝超卖
  • 利用NGINX + lua在网关层面就将无效请求阻挡(防止大流量冲击)
  • 利用MQ消息队列的限流特性保证了MySQL不会被瞬时流量击垮
    • 这里MQ可以设置每次推送给消费者的数量(比如每次推送500条消息,而不是每次全部一起推送),从而让MySQL不会被瞬时的流量击垮
  • APP需要额外的设计轮询机制查询订单的状态

四、相关问题

1、订单创建后,用户长时间不支付,或用户主动订单取消怎么办

  • 如果是用户主动取消订单,那么我们需要提供一个接口用于用户取消时恢复该商品的库存量,这个比较简单,一般是采用lua脚本去将商品库存量+1
  • 如果是订单长时间不支付(比如我们设置如果订单超过30分钟不支付就自动过期),我们也需要释放该订单占用的库存量。这种情况要稍微麻烦一点,主要是如何筛选出超过三十分钟仍未支付的订单?
    • 如果直接通过定时任务去定时查询数据库,查询出支付状态为未支付且订单创建时间超过三十分钟的订单,然后修改订单状态为取消并且释放占用的库存量。这种方案在订单数量不是很大的小项目可行。但是如果在某些单量很大的项目中,这种操作对数据库的压力很大。不是一个很好的解决方案!

2、秒杀接口如何限流防刷

如何防止用户恶意刷秒杀接口

3、秒杀开始前如何隐藏接口

我们的秒杀地址在秒杀开始前一般不会暴露出去的,并且在秒杀的时候需要隐藏我们的秒杀地址,防止有人绕过前端js验证恶意刷接口。

4、如何防止一个用户多次秒杀

某些秒杀场景中需要限制一个用户对一件商品只能进行一次秒杀,如何防止用户多次秒杀呢?

秒杀系统:如何打造并维护一个超大流量的秒杀系统?(代码片段)

秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是12306抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、... 查看详情

如何设计一个高可用高并发秒杀系统

作者:vincentsu,腾讯PCG后台开发工程师如今的互联网已经在海量服务领域有了很成熟的理论,因此自己也很庆幸,能够从0到1完整践行海量服务。微视春节项目中的集卡瓜分活动,是一个典型的秒杀场景,自己参与其中,分享一... 查看详情

解密秒杀系统架构:不是所有的秒杀都是秒杀(代码片段)

摘要:究竟什么样的系统算是高并发系统?今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构。本文分享自华为云社区《【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)&#x... 查看详情

解密秒杀系统架构:不是所有的秒杀都是秒杀(代码片段)

摘要:究竟什么样的系统算是高并发系统?今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构。本文分享自华为云社区《【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)&#x... 查看详情

实践出真知:全网最强秒杀系统架构解密,不是所有的秒杀都是秒杀!!(代码片段)

...那么久,但是,在真正做项目时,仍然不知道如何下手处理高并发业务场景!甚至很多小伙伴仍然停留在只是简单的提供接口(CRUD)阶段,不知道学习的并发知识如何运用到实际项目中,就更别提... 查看详情

实践出真知:全网最强秒杀系统架构解密,不是所有的秒杀都是秒杀!!(代码片段)

...那么久,但是,在真正做项目时,仍然不知道如何下手处理高并发业务场景!甚至很多小伙伴仍然停留在只是简单的提供接口(CRUD)阶段,不知道学习的并发知识如何运用到实际项目中,就更别提... 查看详情

一个秒杀系统的设计思考,超详细!(代码片段)

前言秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是12306抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性... 查看详情

解密秒杀系统架构:不是所有的秒杀都是秒杀

摘要:究竟什么样的系统算是高并发系统?今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构。本文分享自华为云社区《​​【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!​​》,作者:... 查看详情

我要手把手教你搭建一套抗瞬时百万流量的秒杀系统(代码片段)

...高并发、大流量场景的技术方案和架构设计思想,并学会如何将这些技术方案和架构设计思想落地到实际项目中。一、秒杀专栏背景调研相信很多小伙伴学习了不少关于并发编程相关的基础知识,同时,不少小伙伴也看了冰河出... 查看详情

解密高并发系统实战内幕(代码片段)

...里的面试中,通常都会问道高并发的问题。其中以“如何设计一个秒杀系统”、“微信抢红包”这两个场景最为经典。秒杀系统核心业务架构设计剖析业务场景分析: 首先我们先看下秒杀场景的问题都在哪?在秒杀... 查看详情

如何设计一个秒杀系统(代码片段)

什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大... 查看详情

秒杀系统设计(代码片段)

高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出现在商城的促销活动中,指定了一定数量(... 查看详情

不是吧,阿sir,你竟然三分钟就解释了高性能秒杀系统的设计思考(代码片段)

前言秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是12306抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性... 查看详情

如何设计一个高并发系统

  系统拆分,将一个系统拆分为多个子系统,用dubbo来搞。然后每个系统连一个数据库,这样本来就一个库,现在多个数据库,不也可以抗高并发么。   缓存,必须得用缓存。大部分的高并发场景,都是读多写少,那你... 查看详情

秒杀系统设计优化(代码片段)

https://www.cnblogs.com/luyucheng/p/6340758.html12306抢票,票是有限的,库存一份,瞬时流量非常多,都读相同的库存,读写冲突,锁非常严重;小米手机每周二的秒杀,可能手机只有1万部,但瞬时进入的流量可能是几百几千万;这是秒杀... 查看详情

高并发场景下秒杀项目静态锁的使用疑问

...:高并发场景下秒杀项目静态锁的使用疑问场景:我们有一个秒杀平台,可以提供所有接入公司创建的秒杀活动,简单描述如下:1、秒杀10袋洗衣粉,开始时间12:00(项目ID:A001)2、秒杀iPhone5,开始时间12:00(项目ID:A002)3、... 查看详情

聊聊高并发系统之限流特技(代码片段)

...的目的是提升系统访问速度和增大系统处理能力,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰过去或者问题解决后再打开的场景;而有些场景并不能用缓存和降级来... 查看详情

谈如何设计一个秒杀系统(重点)(代码片段)

概述并发读写秒杀要解决的主要问题是:并发读与并发写。并发读的优化理念是尽量减少用户到服务端来读数据,或者让他们读更少的数据;并发写的处理原则一样,要求我们在数据库层面独立出一个库,做特殊的处理。其次,... 查看详情