您当前的位置:首页 > 生活百科 > 科学

如何设计秒杀系统?

时间:2020-03-11 15:23:28  来源:  作者:

前言

redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。

作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(请允许我使用一下夸张的修辞手法)。

于是在一个寂寞难耐的夜晚,我痛定思痛,决定开始写《吊打面试官》系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer!

絮叨

之前写了很多Redis相关的知识点,我又大概回头看了下,除了比较底层的东西没写很深之外,我基本上的点都提到过了,我相信如果只是为了应付面试应该是够了的,但是如果你想把它们真正的吸收纳为己用,还是需要大量的知识积累,和很多实际操作的。

就我自己而言Redis在开发过程中实在用得太普遍了,热点数据的存储啊,整体性能的提升啊都会用到,但是就像我说的技术就是一把双刃剑,使用它们随之而来的问题也会很多的,我在老东家双十二就遇到缓存雪崩问题让整体服务宕机3分钟,相必大家都知道阿里今年的双十一数据了,那三分钟在这种时候到底值多少钱?真的不敢想象。

Redis的普遍我就拿掘金我自己的认知举例,不知道对不对,但是目测是对的。

阿里面试官问我:如何设计秒杀系统?我的回答让他竖起了大拇指
 
 
 

 

大家看到问题所在了么?是的热门的赞的数据不是最新的,我盲猜一波上面的热门文章是缓存。失效时间应该是几十分钟的,为啥这么做呢?

热门文章是大家共同都会看到的,也就是热点数据,在那做缓存,他是不需要那么高的实时性的,那下面的文章列表是最新发布的文章,有高实时性的特点,大家访问多的放在缓存还可以给DB减少压力,我也不知道掘金是不是这么做的哈,反正道理是这么个道理了。

那什么场景是使用Redis比较复杂的场景,而且需要大量中间件业务逻辑去配合的呢?

秒杀!是的就是今天的主题秒杀,我就用我自己的思路带大家一起看一下,设计一个秒杀从前到后,从内到外到底要技术人员做多少准备。

正文

首先设计一个系统之前,我们需要先确认我们的业务场景是怎么样子的,我就带着大家一起假设一个场景好吧。

场景

我们现场要卖100件下面这个婴儿纸尿裤,然后我们根据以往这样秒杀活动的数据经验来看,目测来抢这100件纸尿裤的人足足有10万人。(南极人打钱!)

阿里面试官问我:如何设计秒杀系统?我的回答让他竖起了大拇指
 
 
 

 

你一听,完了呀,这我们的服务器哪里顶得住啊!说真的直接打DB肯定挂。但是别急嘛,有暖男码农之屋在,我们在开始之前应该先思考下会出现哪些问题

问题

高并发:

是的高并发这个是我们想都不用想的一个点,一瞬间这么多人进来这不是高并发什么时候是呢?

是吧,秒杀的特点就是这样时间极短、 瞬间用户量大

正常的店铺营销都是用极低的价格配合上短信、App的精准推送,吸引特别多的用户来参与这场秒杀,爽了商家苦了开发呀

秒杀大家都知道如果真的营销到位,价格诱人,几十万的流量我觉得完全不是问题,那单机的Redis我感觉3-4W的QPS还是能顶得住的,但是再高了就没办法了,那这个数据随便搞个热销商品的秒杀可能都不止了。

大量的请求进来,我们需要考虑的点就很多了,缓存雪崩缓存击穿缓存穿透这些我之前提到的点都是有可能发生的,出现问题打挂DB那就很难受了,活动失败用户体验差,活动人气没了,最后背锅的还是开发

 
 
 
 

 

超卖:

但凡是个秒杀,都怕超卖,我这里举例的只是尿不湿,要是换成100个华为MatePro30,商家的预算经费卖100个可以赚点还可以造势,结果你写错程序多卖出去200个,你不发货用户投诉你,平台封你店,你发货就血亏,你怎么办?

那最后只能杀个开发祭天解气了,秒杀的价格本来就低了,基本上都是不怎么赚钱的,超卖了就恐怖了呀,所以超卖也是很关键的一个点。

阿里面试官问我:如何设计秒杀系统?我的回答让他竖起了大拇指
 
 
 

 

恶意请求:

你这么低的价格,假如我抢到了,我转手卖掉我不是血赚?就算我不卖我也不亏啊,那用户知道,你知道,别的别有用心的人(黑客、黄牛…)肯定也知道的。

那简单啊,我知道你什么时候抢,我搞个几十台机器搞点脚本,我也模拟出来十几万个人左右的请求,那我是不是意味着我基本上有80%的成功率了。

真实情况可能远远不止,因为机器请求的速度比人的手速往往快太多了,在贵州的敖丙我每年回家抢高铁票都是秒光的,我也不知道有没有黄牛的功劳,我要Diss你,黄牛。杰伦演唱会门票抢不到,我也Diss你。

Tip:科普下,小道消息了解到的,黄牛的抢票系统,比国内很多小公司的系统还吊很多,架构设计都是顶级的,我用顶配的服务加上顶配的架构设计,你还想看演唱会?还想回家?

不过不用黄牛我回家都难,我们云贵川跟我一样要回家过年的仔太多了555!

链接暴露:

前面几个问题大家可能都很好理解,一看到这个有的小伙伴可能会比较疑惑,啥是链接暴露呀?

阿里面试官问我:如何设计秒杀系统?我的回答让他竖起了大拇指
 
 
 

 

相信是个开发同学都对这个画面一点都不陌生吧,懂点行的仔都可以打开谷歌的开发者模式,然后看看你的网页代码,有的就有URL,但是我写VUE的时候是事件触发然后去调用文件里面的接口看源码看不到,但是我可以点击一下查看你的请求地址啊,不过你好像可以对按钮在秒杀前置灰。

不管怎么样子都有危险,撇开外面的所有的东西你都挡住了,你卖这个东西实在便宜得过分,有诱惑力,你能保证开发不动心?开发知道地址,在秒杀的时候自己提前请求。。。(开发:怎么TM又是我)

阿里面试官问我:如何设计秒杀系统?我的回答让他竖起了大拇指
 
 
 

 

数据库:

每秒上万甚至十几万的QPS(每秒请求数)直接打到数据库,基本上都要把库打挂掉,而且你服务不单单是做秒杀的还涉及其他的业务,你没做降级、限流、熔断啥的,别的一起挂,小公司的话可能全站崩溃404

反正不管你秒杀怎么挂,你别把别的搞挂了对吧,搞挂了就不是杀一个程序员能搞定的。

程序员:我TM好难啊!

问题都列出来了,那怎么设计,怎么解决这些问题就是接下去要考虑的了,我们对症下药。

服务单一职责:

设计个能抗住高并发的系统,我觉得还是得单一职责

什么意思呢,大家都知道现在设计都是微服务的设计思想,然后再用分布式的部署方式

也就是我们下单是有个订单服务,用户登录管理等有个用户服务等等,那为啥我们不给秒杀也开个服务,我们把秒杀的代码业务逻辑放一起。

单独给他建立一个数据库,现在的互联网架构部署都是分库的,一样的就是订单服务对应订单库,秒杀我们也给他建立自己的秒杀库。

至于表就看大家怎么设计了,该设置索引的地方还是要设置索引的,建完后记得用explain看看SQL的执行计划。(不了解的小伙伴也没事,MySQL章节我会说的)

单一职责的好处就是就算秒杀没抗住,秒杀库崩了,服务挂了,也不会影响到其他的服务。(强行高可用)

秒杀链接加盐:

我们上面说了链接要是提前暴露出去可能有人直接访问url就提前秒杀了,那又有小伙伴要说了我做个时间的校验就好了呀,那我告诉你,知道链接的地址比起页面人工点击的还是有很大优势

我知道url了,那我通过程序不断获取最新的北京时间,可以达到毫秒级别的,我就在00毫秒的时候请求,我敢说绝对比你人工点的成功率大太多了,而且我可以一毫秒发送N次请求,搞不好你卖100个产品我全拿了。

 

 

那这种情况怎么避免?

简单,把URL动态化,就连写代码的人都不知道,你就通过MD5之类的加密算法加密随机的字符串去做url,然后通过前端代码获取url后台校验才能通过。

暖男我呢,又准备了一个简单的url加密给大家尝尝鲜,还不点个赞

阿里面试官问我:如何设计秒杀系统?我的回答让他竖起了大拇指
 
 
 

 

Redis集群:

之前不是说单机的Redis顶不住嘛,那简单多找几个兄弟啊,秒杀本来就是读多写少,那你们是不是瞬间想起来我之前跟你们提到过的,Redis集群主从同步读写分离,我们还搞点哨兵,开启持久化直接无敌高可用!

阿里面试官问我:如何设计秒杀系统?我的回答让他竖起了大拇指
 
 
 

 

Nginx

Nginx大家想必都不陌生了吧,这玩意是高性能的web服务器,并发也随便顶几万不是梦,但是我们的Tomcat只能顶几百的并发呀,那简单呀负载均衡嘛,一台服务几百,那就多搞点,在秒杀的时候多租点流量机

Tip:据我所知国内某大厂就是在去年春节活动期间租光了亚洲所有的服务器,小公司也很喜欢在双十一期间买流量机来顶住压力。

阿里面试官问我:如何设计秒杀系统?我的回答让他竖起了大拇指
 
 
 

 

这样一对比是不是觉得你的集群能顶很多了。

恶意请求拦截也需要用到它,一般单个用户请求次数太夸张,不像人为的请求在网关那一层就得拦截掉了,不然请求多了他抢不抢得到是一回事,服务器压力上去了,可能占用网络带宽或者把服务器打崩、缓存击穿等等。

资源静态化:

秒杀一般都是特定的商品还有页面模板,现在一般都是前后端分离的,所以页面一般都是不会经过后端的,但是前端也要自己的服务器啊,那就把能提前放入cdn服务器的东西都放进去,反正把所有能提升效率的步骤都做一下,减少真正秒杀时候服务器的压力。

按钮控制:

大家有没有发现没到秒杀前,一般按钮都是置灰的,只有时间到了,才能点击。

这是因为怕大家在时间快到的最后几秒秒疯狂请求服务器,然后还没到秒杀的时候基本上服务器就挂了。

这个时候就需要前端的配合,定时去请求你的后端服务器,获取最新的北京时间,到时间点再给按钮可用状态。

按钮可以点击之后也得给他置灰几秒,不然他一样在开始之后一直点的。你敢说你们秒杀的时候不是这样的?

 
 

 

限流:

限流这里我觉得应该分为前端限流后端限流

前端限流:这个很简单,一般秒杀不会让你一直点的,一般都是点击一下或者两下然后几秒之后才可以继续点击,这也是保护服务器的一种手段。

后端限流:秒杀的时候肯定是涉及到后续的订单生成和支付等操作,但是都只是成功的幸运儿才会走到那一步,那一旦100个产品卖光了,return了一个false,前端直接秒杀结束,然后你后端也关闭后续无效请求的介入了。

Tip:真正的限流还会有限流组件的加入例如:阿里的Sentinel、Hystrix等。我这里就不展开了,就说一下物理的限流。

库存预热:

秒杀的本质,就是对库存的抢夺,每个秒杀的用户来你都去数据库查询库存校验库存,然后扣减库存,撇开性能因数,你不觉得这样好繁琐,对业务开发人员都不友好,而且数据库顶不住啊。

开发:你tm总算为我着想一次了。

 

那怎么办?

我们都知道数据库顶不住但是他的兄弟非关系型的数据库Redis能顶啊!

那不简单了,我们要开始秒杀前你通过定时任务或者运维同学提前把商品的库存加载到Redis中去,让整个流程都在Redis里面去做,然后等秒杀介绍了,再异步的去修改库存就好了。

但是用了Redis就有一个问题了,我们上面说了我们采用主从,就是我们会去读取库存然后再判断然后有库存才去减库存,正常情况没问题,但是高并发的情况问题就很大了。

这里我就不画图了,我本来想画图的,想了半天我觉得语言可能更好表达一点。

多品几遍!!!就比如现在库存只剩下1个了,我们高并发嘛,4个服务器一起查询了发现都是还有1个,那大家都觉得是自己抢到了,就都去扣库存,那结果就变成了-3,是的只有一个是真的抢到了,别的都是超卖的。咋办?

Lua:

之前的文章就简单的提到了他,我今天就多一定点篇幅说一下吧。

Lua 脚本功能是 Reids在 2.6 版本的最大亮点, 通过内嵌对 Lua 环境的支持, Redis 解决了长久以来不能高效地处理 CAS (check-and-set)命令的缺点, 并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式。

Lua脚本是类似Redis事务,有一定的原子性,不会被其他命令插队,可以完成一些Redis事务性的操作。这点是关键。

知道原理了,我们就写一个脚本把判断库存扣减库存的操作都写在一个脚本丢给Redis去做,那到0了后面的都Return False了是吧,一个失败了你修改一个开关,直接挡住所有的请求,然后再做后面的事情嘛。

限流&降级&熔断&隔离:

这个为啥要做呢,不怕一万就怕万一,万一你真的顶不住了,限流,顶不住就挡一部分出去但是不能说不行,降级,降级了还是被打挂了,熔断,至少不要影响别的系统,隔离,你本身就独立的,但是你会调用其他的系统嘛,你快不行了你别拖累兄弟们啊。

削峰填谷:

一说到这个名词,很多小伙伴就知道了,对的MQ,你买东西少了你直接100个请求改库我觉得没问题,但是万一秒杀一万个,10万个呢?服务器挂了,程序员又要背锅的

Tip:可能小伙伴说我们业务达不到这个量级,没必要。但是我想说我们写代码,就不应该写出有逻辑漏洞的代码,至少以后公司体量上去了,别人一看居然不用改代码,一看代码作者是码农之屋?有点东西!

你可以把它放消息队列,然后一点点消费去改库存就好了嘛,不过单个商品其实一次修改就够了,我这里说的是某个点多个商品一起秒杀的场景,像极了双十一零点。

总结

到这里我想我已经基本上把该考虑的点还有对应的解决方案也都说了一下,不知道还有没有没考虑到的,但是就算没考虑到我想我这个设计,应该也能撑住一个完整的秒杀流程。

最后我就画个完整的流程图给大家收个尾吧!

阿里面试官问我:如何设计秒杀系统?我的回答让他竖起了大拇指
 
 
 

 

Tip:这个链路还是比较简单的,很多细节的点全部画出来就太复杂了,我上面已经提到了所有的注意点了,大家都看看,真正的秒杀有比我这个简单的,也有比我这个复杂N倍的,之前的电商老东家就做的很高级,有机会也可以跟你们探讨,不过是面试嘛,我就给思路,让你理解比较关键的点。秒杀这章我脑细胞死了很多,考虑了很多个点,最后还是出来了,忍不住给自己点赞

这章是真的不要白嫖,每次都看了不点赞,你们想白嫖我么?你们好坏喲,不过我好喜欢

总结

我们玩归玩,闹归闹,别拿面试开玩笑。

秒杀不一定是每个同学都会问到的,至少肯定没Redis基础那样常问,但是一旦问到,大家一定要回答到点上。

至少你得说出可能出现的情况需要注意的情况,以及对于的解决思路和方案

最后就是需要对整个链路比较熟悉,注意是一个完整的链路,前端怎么设计的呀,网关的作用呀,怎么解决Redis的并发竞争啊,数据的同步方式呀,MQ的作用啊。

(提到MQ又是一整条的知识链路,什么异步、削峰、解耦等等,所以面试,我们还是不打没有把握的胜仗)



Tags:秒杀系统   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
导论曾经被问过好多次怎样实现秒杀系统的问题。昨天又在CSDN架构师微信群被问到了。因此这里把我设想的实现秒杀系统的价格设计分享出来。供大家参考。秒杀系统的架构设计秒...【详细内容】
2021-03-03  Tags: 秒杀系统  点击:(175)  评论:(0)  加入收藏
秒杀业务分析正常电子商务流程: 查询商品 创建订单 扣减库存 更新订单 付款 卖家发货秒杀业务的特性 低廉价格 大幅推广 瞬时售空 一般是定时上架 时间短、瞬时并发量高秒杀...【详细内容】
2020-07-04  Tags: 秒杀系统  点击:(125)  评论:(0)  加入收藏
究竟什么样的系统算是高并发系统?今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构,结合高并发专题下的其他文章,学以致用。...【详细内容】
2020-04-20  Tags: 秒杀系统  点击:(54)  评论:(0)  加入收藏
前言Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次Offer...【详细内容】
2020-03-11  Tags: 秒杀系统  点击:(168)  评论:(0)  加入收藏
简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质上是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大流量...【详细内容】
2019-11-25  Tags: 秒杀系统  点击:(71)  评论:(0)  加入收藏
前言秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过...【详细内容】
2019-11-19  Tags: 秒杀系统  点击:(65)  评论:(0)  加入收藏
【51CTO.com原创稿件】说到“秒杀”,恐怕大多数人想到的就是“双 11”,“促销”,“买买买”等火爆的场面吧。 图片来自 Pexels大家为了打折商品蜂拥而至,造成电商网站一片繁华...【详细内容】
2019-09-24  Tags: 秒杀系统  点击:(148)  评论:(0)  加入收藏
#0 系列目录# 秒杀系统架构 秒杀系统架构分析与实战#1 秒杀业务分析# 正常电子商务流程(1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货 秒杀业务的特性(1)低廉价格;(2)大幅...【详细内容】
2019-08-21  Tags: 秒杀系统  点击:(209)  评论:(0)  加入收藏
什么是秒杀?“秒杀”是商家在特定时间点进行促销的一种运营手段,体现在系统层面,是指一个Web系统,在一秒钟收到数以万计的用户请求,来抢购数量有限的促销产品。本质上,秒杀系统就...【详细内容】
2019-08-08  Tags: 秒杀系统  点击:(220)  评论:(0)  加入收藏
内容:“商品秒杀”功能模块是建立在“商品详情”功能模块的基础之上,对于这一功能模块而言,其主要的核心流程在于:前端发起抢购请求,该请求将携带着一些请求数据:待秒杀Id跟当前用...【详细内容】
2019-07-23  Tags: 秒杀系统  点击:(350)  评论:(0)  加入收藏
▌简易百科推荐
日本在今年又给大家带来了一个巨大消息,日本著名的球星本田圭佑出资设立的一家公司,正式发售了飞行摩托车。 在之前可是在电视或者是电影中才能看到的,是具备了未来科幻的一个...【详细内容】
2021-12-28  科学知识点    Tags:飞行摩托   点击:(4)  评论:(0)  加入收藏
在海洋、陆地、天空三片领域中,都有处在食物链顶端的王者,它们站在食物链顶端,拥有王者的身份,如海洋霸主虎鲸是毫无争议的海洋王者,在海洋中,基本上是所向披靡,没有天敌,而草原王者...【详细内容】
2021-12-17  小楠动物世界    Tags:   点击:(8)  评论:(0)  加入收藏
氦元素在全宇宙的质量中大约占了24%,但是在地球大气中的浓度为5.2 ppm(1ppm=0.0001%)[1],因此称它为稀有气体。稀有气体也被称为惰性气体,化学反应上的惰性也是造成氦气在地球上含...【详细内容】
2021-12-15  中科院物理所    Tags:稀有气体   点击:(8)  评论:(0)  加入收藏
在管理工作中,有些传统的做法是错误的,我们要避免犯这些错误。以下这11条,都是错的。 01 . 拒绝承担个人责任有一次,有一项工作出了差错,董事长把我叫去骂了一顿。我对董事长说,“...【详细内容】
2021-12-14  股权设计布局    Tags:管理   点击:(5)  评论:(0)  加入收藏
对光的研究起源于古希腊,在那里,哲学家们开始思考视觉是如何工作的。柏拉图和毕达哥拉斯等思想家认为,我们的眼睛会发出微弱的光线进行探测。这些光线将收集我们周围物体的信息...【详细内容】
2021-12-08    中科院物理所  Tags:   点击:(12)  评论:(0)  加入收藏
据阿根廷布宜诺斯艾利斯经济新闻网12月6日报道,进食后感到困倦或疲惫是很常见的。这可以解释为,在那一刻,身体所有的能量都“投入”在消化过程中,短时间内感到有点昏昏欲睡非常...【详细内容】
2021-12-08    参考消息  Tags:犯困   点击:(8)  评论:(0)  加入收藏
量子力学能用来干什么?更该问的是它不能干什么!在知道了量子力学这个学科后,许多人就会来问:它能用来干什么?实际上,这个问题问偏了。真正有意义的问题是:量子力学不能用来干什么?因...【详细内容】
2021-12-07  中科院物理所    Tags:量子力学   点击:(16)  评论:(0)  加入收藏
电流是什么?首先回想下,我们学过的电流的定义是什么?很简单,导体中的带电粒子的定向运动就是电流。只有当物质内具有能自由移动的带电粒子,它才可以传输电流——即导电...【详细内容】
2021-12-07    中科院物理所  Tags:电流   点击:(25)  评论:(0)  加入收藏
要理解光速不变原理。首先要有抛弃固有的思维模式的思想准备,否则不容易理解。因为爱因斯坦这个理论有点离经叛道。 我们都知道,描叙一个运动,必须有参考系才有意义。说一列火...【详细内容】
2021-11-30  宇宙探索    Tags:光速不变   点击:(18)  评论:(0)  加入收藏
一半是彻夜无眠,而床上的另一半是呼噜声连绵不绝。这个场景恐怕是很多家庭的真实写照了吧。更让人崩溃的是,推一下不打了,下一秒又开始了“呼~~~呼~~呼”。给我闭嘴!!!那为什么“...【详细内容】
2021-11-17    科普中国  Tags:打呼噜   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条