一:应用场景及技术挑战
假设网站秒杀活动只推出1件商品,会吸引一万人参加活动,也就是说最大请求数是10000。
1,对现有网站业务造成冲击
秒杀活动是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必然会对现有业务造成冲击,严重导致整个网站瘫痪。
2,高并发下的应用,数据库负载
用户在秒杀开始前,通过不停刷新浏览器页面保证不会错过秒杀活动,这些请求如果按照一般的网站应用架构,访问服务器,连接数据库,会对应用服务器和数据库造成很大的压力。
3,突然新增的网络及服务器带宽
假设商品页面大小为了200k(主要是商品图片大小),那么需求的网络和服务器带宽是2G(200k*1000),假设有一万人参加活动,这些网络带宽是因为秒杀活动新增的,超过网站平时使用的带宽。
4,直接下单
游戏规则是秒杀时间活动才开始对商品下单购买,在此时间点之前,只能浏览商品信息不能下单。下单页面是一个URL,得到这个URL,不用等到秒杀开始就可以下单了。
二:秒杀活动应对策略
1,秒杀系统独立部署
为了避免因为秒杀活动的高并发访问拖垮整个网站,使整个网站不必面对蜂拥而至的用户访问,可将秒杀系统独立部署;如果需要,可以使用独立的域名,使其与网站完全隔离,即使秒杀系统崩溃了,也不会对网站造成任何影响。
2,秒杀商品页面静态化
设计秒杀商品页面,不使用网站原来的商品详情页面,页面内容静态化;将商品描述,商品参数等商品属性全部写入一个静态页面,用户请求不需要经过应用服务器和业务逻辑处理,也不需要访问数据库。
3,租借秒杀活动网络带宽
因为秒杀新增的网络带宽,要和运营商重新购买或租借。为了减轻网站服务器的压力,需要将秒杀商品页面缓存在CDN,同样需要和CDN服务商临时租借新增的出口带宽。
4,动态生成随机下单页面URL
为了避免用户直接访问下单页面URL,需要将该URL动态化,即使秒杀系统的开发者也无法在秒杀活动开始前访问下单页面的URL。办法是在下单页面URL加入由服务器端生成的随机数作为参数,在秒杀活动开始的时候才能得到。
三:技术实现
1,如何控制秒杀商品页面购买按钮的点亮
为了减轻服务端的负载压力,更好地利用CDN,反向代理等性能优化手段,商品页面被设计为静态页面,缓存在CDN,反向代理服务器,秒杀开始时,用户狂刷新页面,请求根本不会到达应用服务器。在秒杀商品静态页面中加入一个javaScript文件应用,该javaScript文件中加入是否开始的标志和URL的随机数参数,当秒杀开始的时候生成一个新的JavaScript文件被用户浏览器加载。该JavaScript文件使用随机版本号,并且不被浏览器,CDN和反向代理服务器缓存。
2,如何只允许第一个提交的订单被发送到订单子系统
由于最终能够更成功秒杀到商品的用户只有一个,因此需要在用户提交订单时,检查是否已经有订单提交。事实上,由于最终能够成功提交订单的用户只有一个,为了减轻下单页面服务器的负载压力,可以控制进入下单页面的入口,只有少数用户能进入下单页面,其他用户直接进入秒杀结束页面。可以采用在活动开始时候,请求发送至服务器,下单服务器检查本机已处理下单请求数目判断是跳到用户填写订单页面还是秒杀活动结束页面。