架构师训练营 -week9 命题作业
秒杀活动的本质其实是营销,通过秒杀活动以更低廉的价格换得更多的流量进来,提高知名度,吸引粉丝。
但秒杀活动本身由于吸引大量用户进来,会对系统造成巨大的冲击,如何承载这么大的并发量是秒杀需要考虑的,所以秒杀最主要考虑的关键问题其实是限流。
秒杀的大概限流通道为:
可以设置三道阀门:
列表页阀门,商品列表页点击详情按钮进入商品详情页,可以通过一个计数器进行控制进入详情页的人数,比如这里只允许1000人进入,其余超出的跳转到“秒杀结束”页。
详情页阀门,商品详情页点击下单按钮进入订单提交页,同样是通过计数器进行控制进入的人数,比如这里为100人,那么最终只有100人可以进入提交订单的页面参与抢购。
秒杀阀门,商品数量有限,比如100个人提交订单到订单系统,但只有10件商品,那么只允许前10个人下单成功,其余的90人进入“秒杀结束”页。
通过这三道阀门,可以逐步将流量限制到一个比较小的数量级,保证不会对后台订单系统造成冲击。
用户不断刷新订单列表页怎么办?
秒杀活动开始前,用户其实也可以不断刷新订单列表页,这样以来后台系统也会收到大量的查询请求。所以一般的做法是将订单列表页作为静态html缓存在cdn服务器上,用户请求直接请求到cdn服务器上转移压力。
怎么判断秒杀开始让进入详情的按钮点亮?
秒杀开始前,从列表页进入详情页的按钮也是灰色的,直到秒杀开始后点亮。这个过程其实是通过一个js文件来控制,刚才说了列表页是静态html从cdn得到,但是这个js确是从后台js服务器动态得到,秒杀开启前js中内容为空;秒杀开启后,js文件返回一串可以秒杀的商品id,商品列表页可以通过这些id点亮已经开始秒杀商品的商品按钮。
如何防止url不提前暴露?
而且这个js除了这一串id,还包含了商品详情的url,这样子就可以做到不会提前对html页面暴露url,防止被不法分子拿到url提前进入详情页。这个url包含一个token,由后台随机生成,绝对不会被猜测到。所以,可以利用这个token进行url的合法校验。
总结:这种方案是通过限流策略不让后台服务器承载太大的压力。
而还有一种方式是不限制前端用户流量,全部承接到后台,由后台通过高并发处理能力的中间件进行秒杀逻辑控制。这里附上一篇之前写的秒杀方案供参考和批评:《redis设计秒杀活动图解》
https://blog.csdn.net/shengqianfeng/article/details/86656143
版权声明: 本文为 InfoQ 作者【J.Spring】的原创文章。
原文链接:【http://xie.infoq.cn/article/2b3520aaf9a9a67748ed63072】。文章转载请联系作者。
评论 (2 条评论)