一个大型网站需要具备哪些特点,应该设计怎样的架构才能使大型网站稳定高效地运行?本节就从大型网站的特点和大型网站的架构模式两个方面来介绍,让读者对大型网站的概念有更深入的了解。
大型网站的特点
传统的网站访问量小,用户量少,使用一般的LAMP或LNMP架构就可以解决,即在Linux系统上架设一个Apache或Nginx服务器,用PHP的MVC框架编写程序代码,数据存储在MySQL中,这时候不必太多地考虑网站的性能瓶颈和存储瓶颈,一般情况下在访问量不是很大的时候都能满足需求。但是大型网站就不一样了,其所面对的各种情况都比小型网站复杂得多,相比小型网站,大型网站主要有如下特点。
- 高并发,大访问量:大型网站的最直观表现就是有很多用户,很大的访问量,同时在线访问人数也非常多,如淘宝2017年双十一活动一天的交易额为1682亿,交易峰值为32.5万/秒,支付峰值为25.6万/秒,数据库处理峰值为4200万次/秒。面对这么庞大的访问量和交易频次,对网站的整体系统是个很大挑战。
- 弹性伸缩:大型网站通常有访问峰值也有访问低谷,比如淘宝网在一些节日比平常的访问量陡增,但在平时可能访问量会降下来,这就需要网站有“弹性”,可以使网站自动扩容以应对迅速增大的访问量,而在平时又能很快地恢复到原来的状态以节省计算资源。
- 高可用:大型网站需要提供7×24小时不间断的服务,任何时刻的宕机都会影响数千万的用户,进而也会影响网站收入。所以大型网站的稳定高可用也是一个重要标准。
- 系统复杂,模块繁多:大型网站的功能相对比较复杂,一个完整的大型网站已经不仅仅是一个网站了,其会涉及到多个终端,涵盖多个子系统,如何拆分服务系统、如何实现各个系统之间的高效调用也是大型网站的重要一环。比如一个普通的商城就包括订单系统、客户关系系统、促销系统等各个部分。
- 海量数据:大型网站需要存储管理海量的数据,这里面包括用户的属性信息、行为信息,网站的访问日志等各方面的信息。比如国内某知名资讯网站每天产生的广告日志数据就有26TB之多,每天要对这些数据进行抽取、装载、转换等离线计算,并将得出的有效数据加载到实时计算系统以提供在线服务。如何存储和管理这些数据也是巨大的挑战,由此衍生出了数据研发工程师、数据挖掘工程师等专门的职业岗位。
- 环境恶劣:大型网站的用户分布在全球各地,这会导致用户访问网站的网络环境变得复杂,网站的设计者要保证在不同的网络环境下用户随时访问都能有良好的体验。另外,大型网站由于其知名度更容易受到黑客的攻击,做好相应的安全防范尤为必要。大型网站的服务器也会部署在全球各地,实现各地的互通互联,保证全球数据的一致性也是非常重要的。
- 项目迭代:网站的运营要靠不断地迭代升级,不断地增加新功能或升级系统以保证稳定性和提升性能,大型网站由于业务发展的需要会频繁地迭代需求,要确保在上线新功能的同时系统能继续稳定运行,如果出现问题能立即回滚,以使影响和损失最小化。
大型网站的设计要素
大型网站的架构模式是在长期的实践过程中总结出的一套规律,按照这种模式基本都能设计出满足需求的网站。大型网站的架构模式主要涉及到以下几点。
- 解耦:网站越大,功能越复杂,将这些功能拆分成不同的服务模块,形成高内聚低耦合的模块单元,一方面有利于软件的开发和维护,另一方面也降低了部署的成本和难度。一个服务可被其他各需求方调用,易于实现网站功能的复用和扩展。越是大型的网站功能拆分就越细,每个模块会有不同的人或团队负责,如美团将功能拆分成机票、酒店、电影、票务等各种功能,在这个粒度上还会有更小的粒度,如首页、搜索页、详情页等,然后还会有许多背后的服务系统,如商家的数据指标系统,不同的指标可以设置不同的统计口径,还有用户的商品推荐系统,基于位置的推荐、基于用户偏好的推荐或各种特征的组合推荐等。
- 分布式存储:分布式存储主要包含两个方面,如静态资源的分布式部署,采用独立的域名和服务器将诸如CSS、JS、图片等资源放在CDN和图床。另外还有海量数据的分布式存储,单台机器已经无法满足网站产生的数据量了,这些数据需要分布式的存储,对传统的关系型数据库使用分布式部署,或使用NoSQL数据产品等。
- 分布式计算:分布式计算包括离线计算和实时计算,离线计算是为了满足后台的业务需要,通常包括搜索引擎和排序规则的构建、推荐模型的训练、人群标签的聚合、数据仓库的分析统计等,这些需要的计算量非常庞大。目前普遍采用Hadoop或Spark的分布式计算框架来实现这种大规模的计算任务。实时计算提供在线服务,常用的有Flink和Storm等框架。
- 集群:集群是指将许多机器连通在一起,通过均衡设备对外提供服务,当集群中某台机器发生故障时,集群会自动平衡,通过失效转移机制将应用请求转发到其他机器,这样使得在发生某些故障时不影响用户使用,集群系统的构建提高了系统的可用性和稳定性。
- 缓存:缓存就是将数据存放在距离计算最近的位置加快处理速度,缓存会用在软件系统的很多方面,在复杂的系统中,缓存几乎无处无在。比如CDN是通过多级缓存实现资源更新的,用户打开浏览器访问站点,浏览器本身也会缓存一些资源。同样我们也会将一些数据预先加载进高速存储系统里,对热点数据进行缓存。