秒杀系统架构设计

秒杀活动的技术挑战html

1. 对现有网站业务形成冲击redis

秒杀活动只是网站营销的一个附加活动,这个活动具备时间短,并发访问量大的特色,若是和网站原有应用部署在一块儿,必须会对现有业务形成冲击,稍有不慎可能致使整个网站瘫痪。算法

2. 高并发下的应用、数据库负载数据库

用户在秒杀开始前,经过不停刷新浏览器页面以保证不会错过秒杀,这些请求若是按照通常的网站应用架构,访问应用服务器、链接数据库,会对应用服务器和数据库服务器形成极大的负载压力。浏览器

3. 忽然增长的网络及服务器带宽缓存

假设商品页面大小200K(主要是商品图片大小),那么须要的网络和服务器带宽是2G(200K×10000),这些网络带宽是由于秒杀活动新增的,超过网站平时使用的带宽。安全

4. 直接下单性能优化

秒杀的游戏规则是到了秒杀时间才能开始对商品下单购买,在此时间点以前,只能浏览商品信息,不能下单。而下单页面也只是一个普通的URL,若是获得这个URL,不用等到秒杀开始就能够下单了。服务器

 

秒杀系统的应对策略cookie

1. 秒杀系统独立部署

为了不由于秒杀活动的高并发访问而拖垮整个网站,使整个网站没必要面对蜂拥而来的用户访问,可将秒杀系统独立部署;若是须要,还可使用独立的域名,使其与网站彻底隔离,即便秒杀系统崩溃了,也不会对网站形成任何影响。

2. 秒杀商品页面静态化

从新设计秒杀商品页面,不使用网站原来的商品详情页面,页面内容静态化:将商品描述、商品参数、成交记录和用户评价所有写入一个静态页面,用户请求不须要通过应用服务器的业务逻辑处理,也不须要访问数据库。因此秒杀商品服务不须要部署动态的Web服务器和数据库服务器。

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

由于秒杀新增的网络带宽,必须和运营商从新购买或者租借。为了减轻网站服务器的压力,须要将秒杀商品页面缓存在CDN,一样须要和CDN服务商临时租借新增的出口带宽。

4. 动态生成随机下单页面URL

为了不用户直接访问下单页面URL,须要将该URL动态化,即便秒杀系统的开发者也没法在秒杀开始前访问下单页面的URL。办法是在下单页面URL加入由服务器端生成的随机数做为参数,在秒杀开始的时候才能获得。

 

秒杀系统架构设计

秒杀系统为秒杀而设计,不一样于通常的网购行为,参与秒杀活动的用户更关心的是如何能快速刷新商品页面,在秒杀开始的时候抢先进入下单页面,而不是商品详情等用户体验细节,所以秒杀系统的页面设计应尽量简单。

商品页面中的购买按钮只有在秒杀活动开始的时候才变亮,在此以前及秒杀商品卖出后,该按钮都是灰色的,不能够点击。

下单表单也尽量简单,购买数量只能是一个且不能够修改,送货地址和付款方式都使用用户默认设置,没有默认也能够不填,容许等订单提交后修改;只有第一个提交的订单发送给网站的订单子系统,其他用户提交订单后只能看到秒杀结束页面。

 

除了上面提到的秒杀系统的技术挑战及应对策略,还有一些其余问题须要处理。

1. 如何控制秒杀商品页面购买按钮的点亮

购买按钮只有在秒杀开始的时候才能点亮,在此以前是灰色的。若是该页面是动态生成的,固然能够在服务器端构造响应页面输出,控制该按钮是灰色还 是点亮,可是为了减轻服务器端负载压力,更好地利用CDN、反向代理等性能优化手段,该页面被设计为静态页面,缓存在CDN、反向代理服务器上,甚至用户 浏览器上。秒杀开始时,用户刷新页面,请求根本不会到达应用服务器。

解决办法是使用JavaScript脚本控制,在秒杀商品静态页面中加入一个JavaScript文件引用,该JavaScript文件中包含 秒杀开始标志为否;当秒杀开始的时候生成一个新的JavaScript文件(文件名保持不变,只是内容不同),更新秒杀开始标志为是,加入下单页面的 URL及随机数参数(这个随机数只会产生一个,即全部人看到的URL都是同一个,服务器端能够用redis这种分布式缓存服务器来保存随机数),并被用户 浏览器加载,控制秒杀商品页面的展现。这个JavaScript文件的加载能够加上随机版本号(例如xx.js?v=32353823),这样就不会被浏 览器、CDN和反向代理服务器缓存。

这个JavaScript文件很是小,即便每次浏览器刷新都访问JavaScript文件服务器也不会对服务器集群和网络带宽形成太大压力。

 

2. 如何只容许第一个提交的订单被发送到订单子系统

因为最终可以成功秒杀到商品的用户只有一个,所以须要在用户提交订单时,检查是否已经有订单提交。若是已经有订单提交成功,则须要更新 JavaScript文件,更新秒杀开始标志为否,购买按钮变灰。事实上,因为最终可以成功提交订单的用户只有一个,为了减轻下单页面服务器的负载压力, 能够控制进入下单页面的入口,只有少数用户能进入下单页面,其余用户直接进入秒杀结束页面。假设下单服务器集群有10台服务器,每台服务器只接受最多10 个下单请求。在尚未人提交订单成功以前,若是一台服务器已经有十单了,而有的一单都没处理,可能出现的用户体验不佳的场景是用户第一次点击购买按钮进入 已结束页面,再刷新一下页面,有可能被一单都没有处理的服务器处理,进入了填写订单的页面,能够考虑经过cookie的方式来应对,符合一致性原则。固然 能够采用最少链接的负载均衡算法,出现上述状况的几率大大下降。

 

小结

秒杀是对网站架构的极大考验,在难以预计和控制的高并发访问的冲击下,稍有不慎,系统就会被用户秒杀,致使整个系统宕机,活动失败,构成重大事故。所以在 遵循秒杀活动游戏规则的基础上,为了保证系统的安全,保持适度的公平公正便可。即便系统出了故障,也不该该给用户显示出错页面,而是显示秒杀活动结束页 面,避免没必要要的困扰。

 

摘自《大型网站技术架构:核心原理与案例分析》 李智慧  豆瓣读书

相关文章
相关标签/搜索