10年阿里人告诉你:秒杀系统设计就该这么玩

秒杀活动是指网络商家为促销等目的组织或网上限时抢购活动,这种活动具有瞬时并发量大、库存量少和业务逻辑简单等特点。设计一个秒杀系统需要考虑的因素很多,比如对现有业务的影响、网络带宽消耗以及超卖等因素。本文会讨论秒杀系统的各个环节可能存在的问题以及解决方案。

秒杀系统

傻瓜式秒杀系统

秒杀系统的核心难点是并发量,如果不考虑并发问题,那么我们可以用如下图所示的简单的系统结构来实现秒杀系统,用户只有两个简单操作:刷新界面和秒杀按钮,服务端也只有两个服务接口:返回秒杀界面和处理秒杀逻辑。假设本文中秒杀商品有100个,参与秒杀的用户有100w个。

但是在高并发场景下,这个系统会有很多问题,我们全文会针对这些问题一一进行优化

大量用户同时刷新界面,会对服务器的带宽造成非常大的压力;

用户在秒杀前后可以多次重复点击按钮,造成很多不必要的请求;

用户可以通过脚本进行抢购,并且抢购成功率非常高;

服务端承受高并发请求,会出现响应过慢或失败等情况;

数据库承受高并发请求,会导致连接池耗尽和响应缓慢;

如果数据库更新设计得不合理,可能会出现超卖的情况;

秒杀界面CDN

秒杀开始之前,用户都会请求秒杀界面,有的用户甚至会不断地刷新秒杀界面,100W用户可能产生上千万次秒杀界面请求。秒杀界面往往包含很多静态资源,如果这些界面请求全部通过服务器获取,会造成大量的带宽消耗,甚至造成秒杀还没开始服务器就崩了的情况。

对于网页这种静态资源的并发访问,业内早就有成熟的解决方案:内容分发网络(CDN)。我们可以在秒杀开始前,预先把网页的静态资源存放在CDN节点,用户在刷新界面时直接从CDN获取静态资源,从而降低刷新秒杀界面对服务器造成的压力。添加了CDN服务之后,秒杀界面有大量用户同时访问和刷新并不会给服务端带来多大压力。

秒杀按钮优化

我们知道,秒杀系统往往会有一个秒杀按钮,如果不对按钮进行限制,可能存在以下问题:

用户在秒杀开始前点击按钮,造成很多无用的请求;

用户在秒杀开始后多次点击按钮,造成很多重复请求;

所以我们可以对按钮做一些限制:秒杀开始前按钮不可用,用户点击一次秒杀按钮后,按钮也进入不可用状态。这种方式无法限制通过脚本请求后端的情况,但是可以限制正常用户的多次无效点击,大大降低请求量。

秒杀链接优化

普通情况下,用户在点击秒杀按钮的时候,前端会请求一个固定的URL,这个URL可以在前端界面查到。对于普通不懂技术的用户来说,这没有什么问题,如果用户稍微懂点Http协议,就可以在秒杀开始前拿到URL,在秒杀开始前或开始的毫秒级时间内请求秒杀链接,不仅会给服务端带来很大的压力,还会造成不公平现象:商品都被开脚本的人抢走了。

为了避免这种现象,我们可以将URL动态化,即使秒杀系统的开发人员也无法在知晓在秒杀开始时的URL。具体实现方法是在获取秒杀URL的接口中,返回一个服务器端生成的随机数,并在下单URL中传递该参数完成下单。

秒杀验证码

虽然说我上面通过动态URL避免了用户在秒杀开始前请求秒杀链接,但是用户还是可以通过脚本在秒杀开始的那一刻去请求秒杀连接,普通用户基本没有办法和脚本秒杀进行竞争。

我们可以引入机器难以识别的验证码,用户在请求秒杀链接之前,需要填写验证码识别的结果,验证码错误的请求直接拒绝。使用验证码不仅可以增加脚本秒杀的难度,还可以降低请求的QPS,因为请求不再是在秒杀那一刻进来,而会被分散到填写验证码的时间段内。

过滤请求

通过上面的步骤,我们可以减少很多重复请求和脚本请求,可以保证秒杀活动中一个人大致只会请求一次(脚本还是可以请求多次)。但是100W人参与秒杀,每人请求一次秒杀链接也有将近100W次请求,服务器还是扛不住。

仔细分析之后可以发现,秒杀的商品只有100个,最后成功的也只有100个,那么我们100W的请求是不是都有必要请求到秒杀服务器上呢?显而易见,我们没有必要把所有请求都打到秒杀服务器上,我们只需要保证有大于100个请求打到秒杀服务器就可以保证秒杀的正常进行,所以我们可以在用户端和服务端添加一层过滤层,过滤层只要保证有100个以上的请求能打到秒杀服务器端。

我们可以使用Nginx服务器来构建过滤层,一个Nginx服务器也没法抗100W的请求,我们假设每个Nginx服务器可以处理10W的请求,那么我们就需要10台Nginx。那么怎么用保证至少有100个请求可以请求到后端呢?我们可以简单的让每个Nginx服务器只通过前100个请求,后续请求直接返回降级界面。通过Nginx过滤,我们可以把100W的请求过滤为1000个请求,大大减少了服务器端的压力。

Redis缓存

如果通过前面的过滤,请求量依旧非常大,如果数据库无法处理这些请求量,我们就需要在数据库之上添加一层Redis缓存了。单个Redis可以处理几万的QPS,如果预估请求的QPS大于几万,我们还可以使用Redis集群模式来增加Redis的处理能力。

在Redis存放和售卖商品数目大小相同的数字,秒杀服务每次访问数据库之前,都需要先去Redis中扣减库存,扣减成功才能继续更新数据库。这样,最终到的数据库的请求数目和需要售卖商品的数目基本一致,数据库的压力可以大大减少。

Redis原子性

我们知道Redis是不支持事务的,所以可能出现扣减为负数的情况,这种情况下我们可以使用Lua脚本来保证一次扣减操作的原子性,从而保证扣减结果的正确性。

异步更新数据库

通过Redis判断之后,去更新数据库的请求都是必要的请求,这些请求数据库必须要处理,但是如果数据库还是处理不过来这些请求怎么办呢?

这个时候就可以考虑削峰填谷操作了,削峰填谷最好的实践就是MQ了。经过Redis库存扣减判断之后,我们已经确保这次请求需要生成订单,我们就可以通过异步的形式通知订单服务生成订单并扣减库存。

原文链接:

https://www.cnblogs.com/yuhushen/p/15597751.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定...
    码道功臣阅读 6,030评论 2 79
  • 什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定...
    zwb_jianshu阅读 652评论 0 1
  • 什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定...
    zwb_jianshu阅读 548评论 0 0
  • 你知道的越多,你不知道的越多点赞再看,养成习惯本文 GitHub https://github.com/JavaF...
    敖丙Kirk阅读 1,314评论 1 10
  • 前言 高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从...
    匠丶阅读 447评论 1 0