秒杀业务介绍

秒杀系统的实现

  • 秒杀的概念
  • 使用技术点
  • 优化和预防
  • 参考地址
    一、概念
    所谓“秒杀”,就是网络卖家发布一些超低价格的商品,所有买家在同一时间网上抢购的一种销售模式。通俗一点就是网络商家为促销等目的组织的网上限时抢购活动。由于商品价格低廉,往往已上架就被抢购一空,有时只用一秒钟。
    相关业务场景:
    淘宝京东双11秒杀、日常秒杀活动;
    12306抢票
    特点:
    1、特定时间内,用户同一时间进行抢购,网站流量激增;
    2、秒杀请求数量远远大于库存量;
    3、抢购支付成功从数据库减少库存

注意点:高并发、超卖、接口防刷、秒杀URL、大量请求
大致流程如下:
在这里插入图片描述
二、技术点
秒杀架构:秒杀界面 -> 服务器网关(限流、削峰)-> 秒杀服务器层 -> 操作数据库

前端3种方式实现:扩容、静态化、限流
  • 扩容:
    这是最简单的方法,通过增加前端池的整体承载量来抗峰值;

  • 静态化:
    将页面所有可以静态的元素全部压缩并静态化(html,js,css,图片等),并减少动态元素,通过CDN来抗峰值。

  • 限流:
    1、产品层面:用户点击‘购买’按钮后,按钮置灰,禁止用户重复提交请求;
    2、js层面限制:限制用户x秒内只能提交一次请求;
    3、接口层:采用IP级别限流(即针对某个IP,限制单位时间内发起的请求数量); 比如nginx限流。
    4、展示层:增加游戏或者问题。

  • 有损服务:
    最后一招,在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动整体的可用性。

后端处理方式:排队、缓存

消息队列缓存:可以把这些请求全部都写到消息队列缓存一下,数据库订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。
采用缓存应对读请求:对于读写少的业务,大部分是查询的请求,可以利用缓存分担数据库的压力。
利用缓存读写请求:缓存也是可以应对读写请求的,我们可以把数据库中的库存数转Redis 缓存中,所有减少库存的操作都在Redis中,然后通过后天进程中的用户秒杀请求同步到数据库中。

三、优化和预防

秒杀业务之所以难做,就是在于同一时间大量用户抢购,流量瞬间特别多,读写冲突,死锁严重。优化点就是针对这点进行优化,主要两个方向:1、将请求尽量拦截在系统上游(越上游越好);2、充分利用缓存(缓存抗读压力)。

针对秒杀所产生的问题点,我们应该如何去预防?

  • 高并发: CDN静态资源缓存、nginx负载均衡

  • 接口防刷: nginx做IP限制,每个人只能在单位时间内请求固定次数,超过次数返回报错; 同一用户在xx秒内重复请求直接拒绝。

  • 秒杀URL: URL地址写成动态地址,每个URL地址都是唯一的,可以加商品ID作为唯一标识,防止有的人在秒杀前就请求地址。

  • 大量请求: 内存缓存+消息队列

  • 超卖: 说到超卖,就涉及到减库存问题,减库存常用的方式有3种:
    下单减库存:买家下单就减库存,这个是最简单的也是最精确的一种,下单时通过数据库的事务机制控制商品库存,这样一定不会出现超卖的情况。
    付款减库存:买家下单后不会立即减库存,只有付款后才会减库存,否则库存一直保留着。
    预扣库存:买家下单后,库存为其保留10分钟,超过10分钟后没有下单,就自动释放库存,让其他买家购买。在买家付款前,系统会校验该订单的库存是否还有保留,没有的话不允许继续付款,有的话完成付款并减去实际库存。

减库存方法 利弊分析:
下单减库存:竞争对手恶意购买全部商品但是不付款,后面取消订单,导致商品错过黄金售卖时间。
付款减库存:如果100个库存,300个人下单成功,只有100个人能正常付款,其他人付不了款,购物体验差。
预扣库存:一般情况下,业务中最常见的就是预扣付款,比如买机票、电影票、火车票等,有‘有效付款时间’,超过这个时间订单自动释放。
但是对于秒杀活动,一般‘抢到就是赚到’,下单不付款的情况较少,再加上卖家对库存有严格限制,所以秒杀商品采用‘下单减库存’更合理。而且下单减库存逻辑上更简单,性能上更占优势,主要控制库存扣减后不能为负数就可以。
秒杀兜底方案:

  • 降级:当系统的容量达到一定程度时,限制或者关闭系统的一些非核心功能,从而把有限的资源保留给更核心的业务;

  • 限流:当系统流量达到瓶颈时,我们需要限制一部分流量来保护系统;

  • 拒绝服务:在nginx上设置过载保护,当机器负载达到某个值时拒绝HTTP请求返回503错误码。

参考地址:
https://zhuanlan.zhihu.com/p/111954447
https://blog.csdn.net/libra_ts/article/details/85198469
https://blog.csdn.net/androidstarjack/article/details/106168784

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值