undefined

大型网站分层简化示意图

前言

本篇文章基本摘自《大型网站技术架构》,文中提到的各种术语和概念大致涵盖了大型网站架构需要的东西,每一条几乎都是一个值得深究的领域,这里只是做一个浅层的描述,以便日后看着本文能够展开思路去思考大型网站中的方方面面的技术细节。

奉上我在这本书上看到的最喜欢的一个观点:

不要企图去设计一个大型网站,大型网站的架构都是根据大型网站自身的业务发展逐渐演化而来的。

前端架构技术

前端架构一般是指将请求到达应用服务器之前的环节,不包含逻辑处理,不处理动态内容。

浏览器优化技术

并不是优化浏览器,而是针对浏览器的特性进行响应速度和加载体验的提升。

常用的手段有:

  1. 页面缓存:设置合理的HTTP响应头如cache-control和expires来进行页面缓存,提升二次访问速度。
  2. 减少HTTP请求数:常用手段有合并js,css,使用sprite图片,针对首屏以外图片延时加载等。
  3. 启用压缩:gzip压缩降低响应体积。
  4. 浏览器多线程请求:由于浏览器对于单域名的同时请求数在4~8个之间,可以通过拆分域名来提高同时请求数,提高页面加载速度。
  5. 优化DOM结构:根据浏览器的渲染特性来去优化DOM结构可以有效优化页面的渲染速度。

CDN

内容分发网络,部署在网络运营商的机房,通过将静态页面、内容分发到离用户最近的机房,可以让用户在最短路径获取到内容。

动静分离

将静态资源,如JS,CSS(包括样式图片),静态页面等内容部署到独立的服务器集群上,设置专用的二级域名,这部分服务器专门针对静态内容进行访问速度优化,与动态内容应用服务器隔离。

图片服务

这部分图片指的主要是用户上传的图片,如运营人员上传的商品图,网站用户上传的头像图片等。这些图片应该被部署在独立的服务器集群上,设置专用二级域名并且针对这类图片文件的特性进行优化。

反向代理服务器

部署在网站机房,在静态服务器,图片服务器,应用服务器的前面,提供内容缓存服务。

DNS

域名服务,将域名解析成IP地址,利用DNS可以实现DNS负载均衡(如广东的用户通过DNS解析后获取的IP地址总是在广东省内的机房),配置CDN也需要修改DNS。

应用层架构技术

 应用层指的是处理网站的主要业务逻辑地方。

开发框架

网站业务的多变性决定了网站开发工程师总是需要不断地生产新的代码,一个好的开发框架应该要能够让团队的成员(如后端程序员,前端程序员,美工)各司其职,同时也提供足够便利的特性以及安全策略,从而提升生产效率。

页面渲染

将分别开发维护的动态内容以及静态内容集成组合成最后显示给用户看的页面。

负载均衡

将多台应用服务器组成一个集群,通过负载均衡技术(HAproxy,LVS)将用户的请求分发到不同的服务器上,以应对用户同时访问产生的高并发负载能力。

Session管理

使用应用服务器集群要求应用服务器必须被设计成无状态的,不保存用户访问的上下文,这个时候就需要有专门的Session服务来让集群使用Session与用户交互。

动态页面静态化

对于访问量并不大变更不频繁的动态内容页面,可以将其静态化为文件,然后通过反向代理,CDN,浏览器缓存等手段提高响应速度以及降低服务器资源使用。

业务拆分

当网站业务变得大而复杂的时候,将网站业务拆分开来,形成多个规模较小的产品,独立开发,部署,维护,降低系统的耦合度,也利于拆分业务数据库。业务拆分后有利于提升开发效率,而且技术难度也比较低,各方面带来的效果也比较好。

服务层架构技术

 服务层提供独立的,可复用的基础服务(以电商为例,如用户服务,订单服务,支付服务,库存服务等等),供给应用服务器调用,完成网站的业务。

分布式消息

利用消息队列机制,实现业务与业务,业务与服务之间的异步消息通信,构建低耦合系统,另外也能做到例如“削峰”之类的效果。

分布式服务

提供高性能,低耦合,易复用,易管理的分布式服务,在网站实现面向服务架构。

分布式缓存

通过可伸缩的服务器集群提供大规模热点数据的缓存服务,是网站性能优化的重要手段。

分布式配置

网站系统的运行需要依赖大量的配置参数,如果这些参数需要修改(比如可伸缩的缓存服务器集群添加新的机器)的时候,可以由配置服务器来提供配置动态推送服务,从而达到无需重启即可将配置修改同步到应用服务器。

存储层架构技术

 提供数据,文件的持久化存储以及管理服务。

分布式文件

网站需要存储的文件大部分是静态页面,图片文件,小视频等比较小的文件,但是这些文件的数目非常庞大,而且持续增长。需要可伸缩性设计比较好的分布式文件系统来管理和存储(如Hadoop)。

关系数据库

大部分业务网站是基于关系数据库进行开发的,但是关系数据库的可伸缩性支持较差。可以通过在应用程序的数据访问层增加数据库访问路由功能,根据业务配置将数据库访问路由到不同的物理数据库上,从而实现关系数据库的分布式访问。

NoSQL

目前各种NoSQl技术产品(Redis,MongoDB,HBASE)层出不穷,在内存管理,数据模型,分布式支持等方面大放异彩,选择合适的NoSQL产品无疑会给网站的开发带来很大的便利。

后台架构技术

网站应用中,除了要处理用户的实时请求以外,还要处理一些非实时的数据分析任务,这些操作通过后台系统定时运行。在大规模的网站上,这些批处理任务大部分时候会基于分布式的MapReduce批处理计算框架或者使用流式实时数据处理框架(如Storm)。

搜索引擎

即使是网站内部的搜索引擎,也需要进行数据增量更新以及全亮更新,构建索引等。

数据仓库

根据离线的数据提供数据分析以及数据挖掘服务。

推荐系统

社交网络以及购物网站通过挖掘任何人之间的关系,人和商品之间的关系,发现潜在的人际关系和购物兴趣,为用户提供个性化推荐服务。

数据采集及监控

网站的运营决策以及运维管理都需要通过数据来提供支持,这些数据的采集工作也是网站架构的重要的部分。

浏览器数据采集

在网页的中插入JS采集脚本,采集用户的系统信息以及操作习惯等数据。这部分数据是UED以及产品部门进行产品优化工作的重要依据。

业务数据采集

业务数据一般分为两种,一种是服务器记录的用户请求访问日志(如NGINX日志),另外一种是应用程序在运行中采集的业务统计数据(如统计用户领取红包记录)。

性能数据采集

性能数据包括两部分,一种是应用程序的性能数据(如接口响应毫秒数,缓存的命中率等),另外一种是服务器性能数据,如系统负载,内存使用率,网卡流量等。

系统监控

将上面提到的数据采集后进行可视化处理,在监控系统进行展示,以便运营人员以及运维人员监控网站的运行情况。更加先进的监控系统是根据监控数据进行自动化运维,自动化处理异常情况(如发现异常是进行自动的拒绝服务,服务降级等处理)。

系统报警

监控系统需要设置各种数据的报警阀值,在监控数据达到阀值的时候进行自动报警,通过邮件,短信,电话等方式联系到工程师进行干预。

安全架构

安全是网站重要的要求,安全的架构可以保证网站和用户的资产。

Web攻击

以HTTP请求发起的攻击,危害最大的是XSS,SQL注入,除此以外还有CSRF,恶意脚本等,这类攻击一般都有比较完善的应对方案,因此是比较容易防范的。

数据保护

敏感信息加密传输与存储,保护网站和用户资产。