秒杀活动的技术挑战
1. 对现有网站业务造成冲击
秒杀活动只是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必须会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪。
2. 高并发下的应用、数据库负载
用户在秒杀开始前,通过不停刷新浏览器页面以保证不会错过秒杀,这些请求如果按照一般的网站应用架构,访问应用服务器、连接数据库,会对应用服务器和数据库服务器造成极大的负载压力。
3. 突然增加的网络及服务器带宽
假设商品页面大小200K(主要是商品图片大小),那么需要的网络和服务器带宽是2G(200K×10000),这些网络带宽是因为秒杀活动新增的,超过网站平时使用的带宽。
4. 直接下单
秒杀的游戏规则是到了秒杀时间才能开始对商品下单购买,在此时间点之前,只能浏览商品信息,不能下单。而下单页面也只是一个普通的URL,如果得到这个URL,不用等到秒杀开始就可以下单了。
秒杀系统的应对策略
1. 秒杀系统独立部署
为了避免因为秒杀活动的高并发访问而拖垮整个网站,使整个网站不必面对蜂拥而来的用户访问,可将秒杀系统独立部署;如果需要,还可以使用独立的域名,使其与网站完全隔离,即使秒杀系统崩溃了,也不会对网站造成任何影响。
2. 秒杀商品页面静态化
重新设计秒杀商品页面,不使用网站原来的商品详情页面,页面内容静态化:将商品描述、商品参数、成交记录和用户评价全部写入一个静态页面,用户请求不需要经过应用服务器的业务逻辑处理,也不需要访问数据库。所以秒杀商品服务不需要部署动态的Web服务器和数据库服务器。
3. 租借秒杀活动网络带宽
因为秒杀新增的网络带宽,必须和运营商重新购买或者租借。为了减轻网站服务器的压力,需要将秒杀商品页面缓存在CDN,同样需要和CDN服务商临时租借新增的出口带宽。
4. 动态生成随机下单页面URL
为了避免用户直接访问下单页面URL,需要将该URL动态化,即使秒杀系统的开发者也无法在秒杀开始前访问下单页面的URL。办法是在下单页面URL加入由服务器端生成的随机数作为参数,在秒杀开始的时候才能得到。
秒杀系统架构设计
秒杀系统为秒杀而设计,不同于一般的网购行为,参与秒杀活动的用户更关心的是如何能快速刷新商品页面,在秒杀开始的时候抢先进入下单页面,而不是商品详情等用户体验细节,因此秒杀系统的页面设计应尽可能简单。
商品页面中的购买按钮只有在秒杀活动开始的时候才变亮,在此之前及秒杀商品卖出后,该按钮都是灰色的,不可以点击。
下单表单也尽可能简单,购买数量只能是一个且不可以修改,送货地址和付款方式都使用用户默认设置,没有默认也可以不填,允许等订单提交后修改;只有第一个提交的订单发送给网站的订单子系统,其余用户提交订单后只能看到秒杀结束页面。
除了上面提到的秒杀系统的技术挑战及应对策略,还有一些其他问题需要处理。
1. 如何控制秒杀商品页面购买按钮的点亮
购买按钮只有在秒杀开始的时候才能点亮,在此之前是灰色的。如果该页面是动态生成的,当然可以在服务器端构造响应页面输出,控制该按钮是灰色还是点亮,但是为了减轻服务器端负载压力,更好地利用CDN、反向代理等性能优化手段,该页面被设计为静态页面,缓存在CDN、反向代理服务器上,甚至用户浏览器上。秒杀开始时,用户刷新页面,请求根本不会到达应用服务器。
解决办法是使用JavaScript脚本控制,在秒杀商品静态页面中加入一个JavaScript文件引用,该JavaScript文件中包含秒杀开始标志为否;当秒杀开始的时候生成一个新的JavaScript文件(文件名保持不变,只是内容不一样),更新秒杀开始标志为是,加入下单页面的URL及随机数参数(这个随机数只会产生一个,即所有人看到的URL都是同一个,服务器端可以用redis这种分布式缓存服务器来保存随机数,引入随机数的目的是让下单页面的URL变得随机,连开发者都无法预知),并被用户浏览器加载,控制秒杀商品页面的展示。这个JavaScript文件的加载可以加上版本号(例如xx.js?v=2014080818),这样就不会被浏览器、CDN和反向代理服务器缓存。
这个JavaScript文件非常小,即使每次浏览器刷新都访问JavaScript文件服务器也不会对服务器集群和网络带宽造成太大压力。
2. 如何只允许第一个提交的订单被发送到订单子系统
由于最终能够成功秒杀到商品的用户只有一个,因此需要在用户提交订单时,检查是否已经有订单提交。如果已经有订单提交成功,则需要更新JavaScript文件,更新秒杀开始标志为否,购买按钮变灰。事实上,由于最终能够成功提交订单的用户只有一个,为了减轻下单页面服务器的负载压力,可以控制进入下单页面的入口,只有少数用户能进入下单页面,其他用户直接进入秒杀结束页面。假设下单服务器集群有10台服务器,每台服务器只接受最多10个下单请求。在还没有人提交订单成功之前,如果一台服务器已经有十单了,而有的一单都没处理,可能出现的用户体验不佳的场景是用户第一次点击购买按钮进入已结束页面,再刷新一下页面,有可能被一单都没有处理的服务器处理,进入了填写订单的页面,可以考虑通过cookie的方式来应对,符合一致性原则。当然可以采用最少连接的负载均衡算法,出现上述情况的概率大大降低。
小结
秒杀是对网站架构的极大考验,在难以预计和控制的高并发访问的冲击下,稍有不慎,系统就会被用户秒杀,导致整个系统宕机,活动失败,构成重大事故。因此在遵循秒杀活动游戏规则的基础上,为了保证系统的安全,保持适度的公平公正即可。即使系统出了故障,也不应该给用户显示出错页面,而是显示秒杀活动结束页面,避免不必要的困扰。
本文摘自李智慧的《大型网站技术架构:核心原理与案例分析》,对文中的内容做了一点细化与补充。
相关推荐
1.大型网站架构演化 2.大型网站架构模式 3.大型网站核心架构要素 4.网站高性能架构5....网购秒杀系统架构设计案例分析13.大型网站典型故障案例分析14.架构师领导艺术15.网站架构师职场攻略16.漫画网站架构师
12 网购秒杀系统架构设计案例分析 13 大型网站典型故障案例分析 第4篇 架构师 14 架构师领导艺术 15 网站架构师职场攻略 16 漫话网站架构师 附录A 大型网站架构技术一览 附录B Web开发技术发展历程
网购平台-网购平台系统-网购平台系统源码-网购平台管理系统-网购平台管理系统java代码-网购平台系统设计与实现-基于springboot的网购平台系统-基于Web的网购平台系统设计与实现-网购平台网站-网购平台网站代码-网购...
jsp网购系统毕业设计带论文全套jsp网购系统毕业设计带论文全套jsp网购系统毕业设计带论文全套jsp网购系统毕业设计带论文全套jsp网购系统毕业设计带论文全套jsp网购系统毕业设计带论文全套jsp网购系统毕业设计带论文...
### 关于网购系统的数据库课程设计报告的知识点 #### 一、项目背景与目标 本报告主要介绍了基于Visual FoxPro (VFP) 开发的一款网购系统的数据库设计与实现过程。该系统旨在模拟真实的在线购物环境,通过搭建一个...
网购平台-网购平台系统-网购平台系统源码-网购平台管理系统-网购平台管理系统java代码-网购平台系统设计与实现-基于springboot的网购平台系统-基于Web的网购平台系统设计与实现-网购平台网站-网购平台网站代码-网购...
网购系统设计与开发是一项复杂的工程,它涉及前端、后端、数据库、安全性以及用户交互等多方面的技术。在设计和开发网购系统时,不仅需要遵循一般软件开发的最佳实践,还需要特别关注与电商相关的特殊要求,如支付...
本文将围绕大型商城网购系统的架构设计、核心技术及其应用进行深入探讨。 首先,大型商城网购系统的架构设计至关重要。通常,此类系统采用分层架构,包括表现层(用户界面)、业务逻辑层(业务处理)、数据访问层...
本项目为高校餐饮网购与配送系统的微服务架构版本,采用Java语言开发,共包含204个文件,包括172个Java源代码文件、17个XML配置文件、13个YAML配置文件、1个Git忽略文件、1个XLSX文件。该系统专注于后端功能实现,...
网购-网购平台-网购平台源码-网购平台java代码-网购平台设计与实现-基于springboot的网购平台-基于Web的网购平台设计与实现-网购网站-网购网站源码-网购网站java代码-网购项目-网购项目代码-网购系统-网购系统源码-...
《UML网购系统用例图详解》 UML(统一建模语言)是软件开发过程中常用的一种图形化表示工具,它能清晰地描绘出系统的功能和交互。在本例中,我们将深入探讨一个UML用例图,该图用于描述一个在线购物系统,涵盖了...
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载...
这两种图在系统设计和分析中起到关键作用,特别是在复杂的IT系统如网购系统中,它们有助于理解和梳理不同角色之间的动态交互。 序列图(Sequence Diagrams)主要关注对象间的交互顺序,按照时间顺序展示了消息的...
这是一种软件设计模式,常用于构建大型、复杂的Web应用程序,如网购系统。模型(Model)负责处理业务逻辑,视图(View)显示数据,控制器(Controller)处理用户请求并协调模型和视图之间的交互。这种模式有助于实现...
本论文详细地阐述了系统的需求分析、系统总体架构、详细设计以及模块的实现过程,主要实现了以下模块功能:会员注册、登录/注销;用户管理;浏览图书详细信息;图书搜索;图书管理;购物车;订单;订单管理等。 ...
1. **电子商务系统架构**:了解一个完整的电商系统是如何设计的,包括用户界面、后台管理、数据库结构等。 2. **积分兑换机制**:学习如何实现积分的生成、积累、消耗以及兑换流程,这涉及到积分规则的设定、积分与...
### 基于PHP的家电网购系统设计与实现的核心知识点 #### 1. 家电研究背景与项目意义 - **家电研究背景**:随着互联网技术的发展和普及,人们的购物方式发生了翻天覆地的变化。传统的实体店购物逐渐被网络购物所...