1.秒杀活动的技术挑战:
1.1 对现有网站业务造成冲击
1.2 高并发下的应用,数据库负载
1.3 突然增加的网络及服务器带宽
1.4 直接下单
2.秒杀系统对应策略:
2.1 秒杀系统独立部署:
为了避免高并发访问拖垮整个网站,使整个网站不必面对蜂拥而来的用户访问,可将秒杀系统独立部署,如果需要,还可以使用独立域名,使其与网站完全隔离,即使秒杀系统崩溃了,也不会对网站造成任何影响。
2.2 秒杀商品页面静态化:
重新设计秒杀商品页面,不使用原来的商品详情页面,页面内容静态化,将商品描述,参数,成交记录和用户评价全部写入到新的静态页面,用户请求就不需要经过应用服务器的业务逻辑处理,也不需要访问数据库。所以秒杀商品服务不需要部署动态的web服务器和数据库服务器。
2.3 租借秒杀活动网络带宽:
因为秒杀新增的网络带宽,必须和运营商重新购买和租借,为了减轻网站服务器压力,需要将秒杀商品页面缓存在CDN,同样需要和CDN服务商临时租借新增的出口带宽。
2.4 动态生成随机下单页面URL:
为了避免用户直接访问下单页面URL,可将URL动态化,办法是在下单页面URL加入服务器端生成的随机数作为参数,在秒杀的时候才可以得到。
3.秒杀系统架构设计:
3.1 如何控制秒杀商品页面购买按钮的点亮
秒杀前是灰色的,秒杀活动开始才点亮,如果页面是动态生成,可以在服务器端构造响应页面输出,控制该按钮是灰色还是点亮,但为了减轻服务器端的负载压力,更好的利用CDN,反向代理性能优化手段等,该页面被设计为静态页面,缓存在CDN,反向代理服务器上,甚至用户浏览器上。秒杀开始,用户刷新页面,请求根本不会到达应用服务器上。
解决办法是js脚本控制,在秒杀商品静态页面时加入一个js文件引用,该js文件中加入秒杀是否开始的标志和下单页面的随机参数。当秒杀开始,生成一个js文件并被用户所加载,控制秒杀商品页面的展示。这个js文件使用随机版本号,并且不被浏览器,CDN,反向代理服务器缓存。要求js文件必须要小,这样保证每次浏览器访问js文件服务器不会对服务器集群和网络带宽造成太大压力。
3.2 如何只允许第一个提交的订单发送到订单子系统:
可以控制进入下单页面的数量,只有少量用户可以进入到下单页面。
注意:在秒杀活动中,即使出现故障或者错误,不要将错误信息返回到用户页面,要显示活动结束的页面。