今天简单从上层的角度聊一下如何对有一个网站进行优化。
从用户在浏览器敲下回车,到数据回来,至少可以分为三个路径
- 在浏览器端,发送用户请求,并且接受服务器返回的响应数据进行页面渲染。
- 请求数据在网络进行传输,发送到服务器。服务器把响应数据在网络传输返回。
- 服务器端进行数据解析处理(访问文件,数据库等),最后返回响应数据。
我们把第一路径简要称为“前端”,第三路径称为“后端”,看看能在这三层如何对网站的性能做出优化。
前端的过程
1 . 本地DNS解析域名,得到IP地址(并将IP地址缓存起来),向目标IP发送请求(通常为HTTP)
以上过程可以优化的地方主要依靠减少DNS解析的次数。如果用户的浏览器设置了缓存,那么第二次访问相同域名的时候就不会请求DNS服务器了,而是直接用缓存中的IP发送请求。这主要依靠浏览器的相关设置,但我们也可以在页面告知浏览器需要做DNS的预取:
<meta http-equiv="x-dns-prefetch-control" content="on" />
2 . 浏览器得到相应数据做出渲染计算
在这阶段,浏览器主要做的是解析相应数据,创建DOM树,下载CSS样式应用到DOM树中,下载JS文件开始解析。
为了提高页面的访问速度,我们应该尽可能让CSS样式放到<head>
中并且让下载js的语句放到<body>
的末尾,这样就可以使得页面先渲染起来再执行js脚本,用户的等待时间将减小。
注:HTML5支持async
属性支持脚本的异步执行,如:
<script type="text/javascript" src="demo_async.js" async="async"></script>
同时,我们可以设置浏览器的缓存,让浏览器下次防蚊时从缓存中读取内容,减小HTTP请求。
网络传输(第二阶段)
这是阶段的速度取决于网络情况,由于用户的请求的数据很小但往往接受的响应数据很大,所以这要求企业的网络带宽要有快的上行速度,这和用户的带宽是相反的。
后端过程
后端是主要可以发挥的地方,这里包括处理请求,访问数据库等资源的过程。
我们主要可以优化的地方有:
1 . 使用缓存,减缓数据库压力
我们应该尽可能使用缓存提高常用数据的读取数据,减少访问数据库的次数。现在分布式的场景下,可以使用Memcached搭建起分布式缓存。
2 . 使用异步操作代替同步操作,避免阻塞的等待时间,提高性能。
在高并发的情况,同步的请求操作(如数据库插入)会对数据库造成很大压力,同时也会导致用户的等待时间增长,我们应该尽可能使用异步的请求操作代替同步操作,以提高整体服务的响应速度,具体的操作将进入消息队列处理。最终的结果可以使用其他的方式告知用户,如邮件提醒的方式。