深入解析典型的大型互联网应用系统
特点
大型互联网应用系统具备以下特点:
需要面对高并发用户,大流量访问
需要系统7 × 24小时不间断的服务,实现系统高可用
需要存储和管理海量数据
用户分布广泛,网络情况复杂
安全环境恶劣,由于互联网的开发性,使得互联网应用更容易受到攻击
为了快速适应市场,满足用户需求,产品发布频繁
几乎所有的大型互联网应用都是从功能职责简单的小应用渐进式发展的
大型互联网应用的架构
核心架构要素
性能、可用性、伸缩性、扩展性和安全性
高性能
前端性能
请求优化
提升请求的性能可以从以下方面进行优化
减少http请求,每个http请求都需要对应的线程处理,而且每个http请求都需要通讯链路和进行数据传输,因此一个http请求的系统开销很大,减少http请求可以有效的提供web请求性能。减少http请求的主要方法是合并静态资源文件,例如将多个css文件合并,多个js文件合并,或者将多个图片合并。
使用浏览器缓存。页面的静态资源文件的更新频率都是很低的,如果将这些静态资源文件缓存在用户的浏览器中,那么web请求的性能将大大提升。设置浏览器缓存的方式是在http请求头中的Cache-Control 和 Expires属性设置缓存开启和失效时间等配置
通过压缩请求数据而降低web请求数据量大小可以提升web请求性能。通常的办法是通过Gzip将HTNL、CSS、JS和图片进行压缩。
调整前端代码也可以提升请求性能。例如将CSS放在页面最上面,让页面尽快下载CSS进行页面渲染,这样提升页面展示速度。将js放在页面最下面,防止因为加载js而阻塞页面渲染造成的性能影响。
Cookie包含在每次的请求和响应中,过大的Cookie数据会影响请求性能。我们可以通过控制Cookie的数据量并且对于静态资源的访问避免发送Cookie提升请求响应
DNS解析
DNS(域名解析)是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。使用DNS预解析可以提升网站性能。
DNS预解析是浏览器在用户访问链接之前尝试解析域名,如果用户确实访问了解析后的域名,那么域名解析的时间则被提前释放出来,整个请求得到了加速。
CDN内容分发
CDN本质上是部署在离用户最近的运营商机房的缓存,将静态资源文件缓存在CDN上用户就可以用最短的路径获得响应,用户访问速度大大提升。
反向代理
用户第一次访问静态资源时将静态资源缓存在反向代理服务器上,其他用户再访问时,直接从反向代理服务器返回响应,提升web请求响应速度同时降低web应用服务器压力
应用性能
服务器性能
服务器的性能对应用性能影响很大,通常使用以下方式提升性能:
通过是用RAID增加I/O吞吐能力
使用SSD提升I/O访问速度
增加内存减少I/O操作
升级/添加网络接口提升网络吞吐能力
更换服务器,使用更好的CPU提升处理能力
使用缓存
缓存是一个高速存储介质,将数据存放在缓存中可以大大提升系统性能。大型互联网系统一般都使用本地缓存+分布缓存组成的多级缓存设计,通过缓存实现以下功能:
临时数据存储
热点数据存储
计算结果数据存储
……
合理使用缓存可以提升访问速度、减少重复计算、降低数据库压力等
异步操作
大型互联网应用的异步操作一般有使用消息队列和使用异步请求。
消息队列
消息队列提供了异步处理机制,允许应用把消息放入消息中间件中,但并不立即处理它,在之后需要的时候再慢慢处理。
异步请求
异步请求先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。一句话:增加了服务器对客户端请求的吞吐量。
集群部署
通过配合负载均衡技术可以将并发请求分发到多台服务器上,从而避免一台服务器因负载过大而响应缓慢,是用户请求具有更好的响应延迟。
代码优化
代码层次的性能优化主要有以下:
多线程
由于线程比进程更加轻量,占用更少的系统资源,切换代价更小,因此使用多线程处理请求和任务更高效,可以有效的提升系统性能。
资源复用
尽量减少开销很大的系统资源的创建和销毁,例如数据库链接,通信链接等,因此复用这些系统资源可以提升整体性能,通常采用连接池管理这些开销大的链接实现的资源复用。
数据结构
逻辑处理时应使用适合的数据结构,因为每种数据结构的读写复杂度和适用场景不尽相同,在合适的业务场景使用恰当的数据结构可以有效的提升处理效率。
垃圾回收
一般大型互联网应用都是使用java开发的,因此jvm垃圾回收也是一个影响整体性能的关键因素。合理的设置年轻代和老年代,尽量减少Full GC可以提升系统整体性能
存储性能
存储硬件
SSD使用的是将数据存储在持久记忆的硅芯片上,可以像内存一样快速随机访问。因此对于读写要求高的数据存储可以使用SSD存储,这样大大提升存储的性能。
读写分离
读写分离是将访问压力分散到了集群中的多个节点上,通过分摊压力,避免超负荷处理从而提升存储性能的
分库分表
分库分表是将访问压力和存储压力分散到集群中的多个节点上来分摊存储整体压力的。
数据库类型
针对不同的数据类型,使用场景,数据量级选择合适的数据库可以提升整体的性能。例如单表1000万以下的典型关系型数据使用分布式mysql,热点数据使用分布式内存数据库,文档型数据可以使用MongoDB,海量数据存储可以使用HDFS,全量检索型海量数据可以使用Elasticsearch等。
高可用
可用性是指一个应用可有效访问的特性。一个大型应用系统要保证系统是高可用的,一般都是遵循CAP理论,做到
架构高可用
应用高可用
服务高可用
数据高可用
CAP理论:一个分布式系统中,涉及读写操作时只能保证一致性、可用性和分区容错性三者中的两个,另外一个必须被牺牲。理论上不可能选择CA架构,所以只能选择CP或者AP架构实现高可用
伸缩性
架构伸缩性
架构上的伸缩主要是以下两点:
不同功能进行物理分离实现伸缩
* 纵向分层:将业务处理流程上的不同部分分离部署
* 横向分层:将不同业务模块分离部署
单一功能通过集群规模实现伸缩
应用服务器伸缩性
通过将应用服务器设计成无状态的,请求发送到应用集群内的任意一台服务得到的结果都是一样的,这样我们通过负载均衡策略就可以实现应用服务器的伸缩性。常见的负载均衡实现方式有以下三种:
DNS负载均衡
DNS负载均衡是最常见的一种负载均衡方式,一般用于地理级别的负载均衡,例如华北地区用户通过DNS解析请求发送到华北机房,华南地区用户通过DNS解析请求发送到华南机房。
硬件负载均衡
硬件负载均衡是通过独立的硬件设备来实现负载均衡功能的,这类设备和路由器交换机类似。
软件负载均衡
软件负载是通过软件来实现负载均衡功能的一种方式,常见的软件负载有Nginx和LVS。Nginx是软件的7层负载均衡,LVS是Linux内核的4层负载均衡
分布式缓存集群伸缩性
当前使用最多的分布式缓存就是redis了,一般使用redis Cluster,在Redis集群中,数据是以slot为单位的,也就是说,Redis集群的伸缩本质上是slot在不同机器节点间的迁移
数据存储服务器伸缩性
数据存储的伸缩扩展主要是只数据分散集群的伸缩。数据分散集群是指多个服务器组成一个集群,每台服务器都会负责存储一部分数据,整个集群的伸缩性是通过算法实现的,通常集群中会有一个独立的服务器是使用相应的算法保证集群的伸缩性。
Hadoop中负责数据分区的分配叫做Namenode。
Elasticsearch是通过集群选举一台服务器来负责数据分区分配,这台服务器叫做master node。
扩展性
软件系统天生就具有可扩展的特性,这既是软件发展的魅力也是其难点所在。软件系统为了满足新的需求或者顺应技术发展的趋势,需要以最小的代价扩展系统。
可扩展性的系统架构众多,但是本质上都是一个字“拆”。将一个大一统的系统拆分成多个规模小的部分,扩展的时候只修改其中一部分。按照不同的拆分思路来拆分软件系统就会得到不同的架构,常见的拆分思路有以下三种:
面向流程拆分:将整个业务流程拆分为几个阶段,每个阶段作为一部分
面向服务拆分:将系统提供的服务拆分,每个服务作为一个部分
面向功能拆分:将系统提供的功能拆分,每个功能作为一个部分
安全性
对应大型互联网应用的安全防护,一般有以下几种措施
使用应用防火墙
网站用户身份认证
数据加密传输
对用户行为日志记录和分析,做风控管理
非正常请求的监测、过滤和阻断
合理的站点规划和分割
使用负载均衡和负载保护策略
有容灾备份和恢复方案
规范化的管理规章制度
版权声明: 本文为 InfoQ 作者【拈香(曾德政)】的原创文章。
原文链接:【http://xie.infoq.cn/article/538cb0bd90b58ebc0ef1f6d9e】。文章转载请联系作者。
评论