手机端小强原创文章,java小强个人博客站点
当前位置: 首页 >> 文章 >> 电商网站抢购秒杀实现探讨

电商网站抢购秒杀实现探讨

67310 文章 | 2015-11-5

抢购,从互联网这个模块来说,面试中难免有人问题这个问题,前端时间我买了一本书《大型网站技术架构核心原理与案例分析》中也说到了这个问题。

要说,我是没人家说的好,我还是先总结下别人说的吧。


秒杀是一种营销手段,将少量商品以极低价格,在特定时间出售。很多用户在活动前进入网站,秒杀或抢购瞬间,点击按钮抢购商品(在此之前按年灰色,不可点击),所有商品开始后一秒内卖光。

秒杀有利于网站的推广,也给部分消费者带来利益,但是对于网站技术,是一个很大的挑战,因为一个正常运行的网站,一下并发要达到平时的几千倍。秒杀站点必须单独部署,不能和正常网站公用服务器。


秒杀活动技术挑战:

1,对现有网站业务造成冲击

秒杀只是一个附加活动,具有时间短,并发大的特点,如果和正常网站放到一块,可能导致整站瘫痪。

2,高并发下应用和数据库负载

因为用户会不断刷新页面,类似12306抢票,这些请求如果安装一般网站设计,对应用服务器和数据库造成极大的负载压力。

3,网络带宽压力

假如返回一个页面是200K,包括HTML和图片JS等,那么一万个人访问就是200K*10000,2G的带宽流量。这种压力,做过运维的应该清楚。

4,直接下单

秒杀规则就是开始后才能下单,之前只能浏览。下单页面也是一个URL,如果有人破解,不用秒杀就可以下单了。当然,直接下单后后端也必须判断(这话是我加的)。


秒杀系统应对策略

1,秒杀系统独立部署

蜂拥而至的用户访问,如果秒杀系统没有独立部署,会拖垮整个网站。一般我们的Java系统都是分布式部署,这里的独立部署不是简单的把特定请求指向特定服务器,我们甚至可以用二级域名来处理。

2,页面静态化

一般我们做java的,页面就是JSP,但是每个JSP都是动态生成HTML的,如果按照这个思维做秒杀网站,光JSP就能干掉自己的网站。不过现在互联网网站前端都是PHP的,JSP也只有内部系统用了。但是浏览器需要的就是一个HTML,我们在服务器放一个静态页面,不用任何程序处理。

3,租借秒杀活动网络带宽

服务器带宽对外网的话,其实是很贵的。所有之前有很多虚拟空间来做网站,大家公用带宽,节省资本。在比如我的论坛,虽然是独立服务器,但带宽其实很坑的。这里就要和运营商合作,甚至我们可以把静态页面放到CDN。

4,动态的下单URL

为了防止用户直接下单,下单URL应该是动态生成的,而且只有在活动开始的时候外层才能知道。


秒杀系统架构涉及

1,如何控制商品页面购买按钮点亮

购买按钮在活动开始的时候才能点击,在此之前是灰色。如果页面是动态的,那么可以在活动开始的时候改变这个页面,但是上面也说了,页面都存到CDN了,请求不会到应用服务器。

方法是用JS控制,在静态页面引入一个JS,JS文件中有是否开始的标记,和下单的URL。这个JS文件不被浏览和CDN和反向代理缓存。该文件还要非常小,避免对集群服务器造成带宽压力。

2,如果允许第一个提交的订单能下单

如果能秒杀成功的只有一个人,那么提交订单的时候,就得检查是否有订单提交。所以要控制下单页面入口,只有少数用户能进入下单页面,其他直接进入活动结束页面,和秒杀页面一样就是一个简单HTML。


以上,是别人书上说的,大体意思是这样的,我稍加修改让意思更明了。

那么其实他说的是整体思想,如果涉及到实现的时候,主要还是要看活动开始后,下单时这个抢的动作。

资源数量是特定的,大家都来抢了,怎么保证只有前几个能抢到呢?这里就涉及到了线程的问题,我面试的时候竟然说了用消息队列,往队列里面放特定数量消息,客户端消费完了就是抢光了。其实这是有问题的,这和消息队列的特性有关,另外这个时候效率也会有问题。


后来我又想了一下,简述一下我的思路。

有两个标量,1:是否开始。2:当前资源数量。3:是否结束。

刚才说的是JS级别控制了开始,那么其实在网站的后台,请求来了以后也要判断是否开始,防破解。另外要判断是否结束,从这里把运气不好的用户挡住。

如果活动是开始有效的,请求一个特定的接口,接口是线程安全的。

接口首先判断是否有资源,没有返回空,并设置活动结束。如果有则获取并把资源数量减一,返回该资源。


那么此时一个问题,该接口是线程安全的,大量用户访问的时候会不会堵塞?

因为这个接口的处理是足够快的,另外部分用户在是否结束判断时挡住了,我认为不会堵塞住。

框架就是别人说的那么回事,抢的这个操作,我想的是这样的。当然不一定是最好的方案,都说了是探讨

推荐您阅读更多有关于“ 秒杀 抢购 架构 CDN ”的文章

上一篇:一次换工作的纠结,我到底在想什么呢? 下一篇:批量后台订单处理解决方案

猜你喜欢

发表评论:

个人资料
blogger

java小强
没有思考,人生的路会越走越难!

搜索
分类
最新微语
  • 又弄完一个项目,累成狗,但是感觉又进步不少,除了很多坑已经踩过,做起来也是轻车熟路。同时也认识到,程序不在于你多牛逼,而是在乎你的细节把控度,而细节的关注,是一个优秀程序员必须要注意的。另外,要相信自己,勇敢向前,没人生下来就是成功的,而且,成功的路,比成功本身更重要。

    2017-06-30 09:46

  • 今日北京再次沙尘暴来袭,吃了几年细粮,终于能来口粗粮了,不过大早上看见这场景,还是吓我一跳,不过随后就平静了,毕竟是老朋友了。进公司又发现一股烤糊的味道,真是祸不单行啊,例外都是污染。发了两个口罩,开启保护模式。

    2017-05-04 10:16

  • 今天同学问我,最近还在写代码吗?我想了想,这个问题怎么回答呢,我好像确实很长时间,虽然写了一些,但是主要内容已经不是写代码了。然后再想想,自己也7年多了,这么多年了,我收获了什么,我的目标到底是什么。眼看就奔三了,人生啊,开启感叹模式。

    2017-03-30 22:52

  • 也许大家都已经注意到了,今年的房价,好多地方都是翻了一番,跟着就是,各地房东开始变相涨租。今年之所以搬走,就是为此,这两天同学也是如此。很多房东只认钱,别谈感情,伤钱。而对于这个城市来说,你怎么定位自己,你真把自己当成她的一份子?你来此为何?将来何去何从?自己掂量清楚。

    2016-12-05 10:03

  • 为什么一直不写了呢?因为当爸爸了,没空了。今年的冬天,有些寒冷,除了这寒冬带来的不适,更有因乐视公司遇到危机,而带来的同事别离。送别同事,看着空旷的工位,心中有些悲凉。临近年关,此时此刻,该怎么做,似乎不再是脑子一热那么简单了。

    2016-11-24 11:28

  • 更多»

最新文章
热门文章
随机文章