高性能应用系统设计-1-概述

629 阅读6分钟

1.应用系统的高性能

应用系统的高性能,类似于如何让一个人一直保持健康,不去找医生。保持健康的方法我们都知道,饮食均衡、按时休息、持续锻炼身体等等,而对于一个应用系统,一般则需要考虑硬件、操作系统(OS)、中间价、程序自身等系列问题。

高性能设计.png

2.基本设计原则

2.1 分而治之原则

一言以蔽之:"分"

  • 按业务分
  • 按层次分
  • 按读写分
  • 安动静分
  • 按流量分(负载均衡)
  • 按时间分(异步化)

2.2 稳定性原则

"分"完之后还要保证系统的整体稳定性:

  • 荣誉和灾备
  • 监控
  • 预案
  • 限流
  • 降级

3.Web前端性能优化

3.1 浏览器访问优化

  • 减少 http 请求

HTTP协议是无状态的应用层协议,意味着每次HTTP请求都需要建立通信链路、进行数据传输,而在服务器端,每个HTTP都需要启动独立的线程去处理。这些通信和服务的开销都很昂贵,减少HTTP请求的数目可有效提高访问性能。

减少HTTP的主要手段是合并CSS、合并JavaScript、合并图片。将浏览器一次访问需要的JavaScript、CSS合并成一个文件,这样浏览器就只需要一次请求。

  • 使用浏览器缓存

对一个网站而言,CSS、JavaScript、Logo、图标这些静态资源文件更新的频率都比较低,而这些文件又几乎是每次HTTP请求都需要的,如果将这些文件缓存在浏览器中,可以极好地改善性能。通过设置HTTP头中Cache-Control和Expires的属性,可设定浏览器缓存,缓存时间可以是数天,甚至是几个月。

特别要注意,在更新静态资源时不宜同时全部更新,而是应一个文件一个文件逐步更新,并有一定的间隔时间,以免用户浏览器突然大量缓存失效,集中更新缓存,造成服务器负载骤增、网络堵塞的情况。

  • 启用压缩

在服务器端对文件进行压缩,在浏览器端对文件解压缩,可有效减少通信传输的数据量

  • CSS放在页面最上面、JavaScript放在页面最下面

浏览器会在下载完全部CSS之后才对整个页面进行渲染,因此最好的做法是将CSS放在页面最上面,让浏览器尽快下载CSS。JavaScript则相反,浏览器在加载JavaScript后立即执行,有可能会阻塞整个页面,造成页面显示缓慢,因此JavaScript最好放在页面最下面。

  • 减少减少Cookie传输

一方面,Cookie包含在每次请求和响应中,太大的Cookie会严重影响数据传输,因此哪些数据需要写入Cookie需要慎重考虑,尽量减少Cookie中传输的数据量。另一方面,对于某些静态资源的访问,如CSS、Script等,发送Cookie没有意义,可以考虑静态资源使用独立域名访问,避免请求静态资源时发送Cookie,减少Cookie传输的次数。

3.2 CDN加速

CDN的全称是(Content Delivery Network),即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络”边缘“的节点,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,提高用户访问网站的响应速度。

简单的说,CDN的工作原理就是将您源站的资源缓存到位于全球各地的CDN节点上,用户请求资源时,就近返回节点上缓存的资源,而不需要每个用户的请求都回您的源站获取,避免网络拥塞、缓解源站压力,保证用户访问资源的速度和体验

3.3 反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

通过在网络各处放置反向代理节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上

4.应用服务器性能优化

4.1 分布式缓存

分布式缓存是为了解决数据库服务器和Web服务器之间的瓶颈。如果一个网站流量很大,瓶颈将会非常明显,每次数据库查询的时间不容乐观,则可以通过分布式缓存系统来解决,如Redis,MemCache等。

4.2 异步化

异步化可以利用线程池,消息队列等方式设置。使用线程池一定要注意核心参数的设置,可以通过监控工具去观测实际创建、活跃、空闲的线程数,结合CPU,内存的使用率情况来做线程池调优;另一种是通过NIP来实现异步化、

4.3 服务化集群

服务化最基础的是按业务做服务拆分,避免跨业务的互相影响,数据和服务同时拆分。

同一个业务内部我们还可以按照计算密集型/IO密集型的服务拆分,核心/非核心业务拆分,高频服务单独部署等原则做拆分。

4.4 代码逻辑优化

代码逻辑优化经常容易被忽略,但效果却往往比数据库调优,JVM调优等来的更为明显。以12306春运抢火车票为例,访问的用户很多,用户进行查询可能会比较慢,用户会习惯性的多次点击查询,更增加了后端系统的负载,而实际上这多次查询的请求都是重复请求。这种情况下,我们可以在用户点击查询后将按钮置灰,或者通过JS来控制多少秒内只能提交一次请求等。

4.5 硬件优化

硬件优化不用多说,条件允许的情况下,硬件性能直接拉满!比如固态硬盘肯定比机械硬盘性能更好。

5.数据库性能优化

  • 索引优化

  • 消除大数据表连接

  • 反范式

  • Cache缓存

  • 拆分为多次查询

  • 避免复杂SQL

  • SQL性能优化