高并发下如何缩短响应时间

定义

网站响应时间是指系统对请求做出响应的时间。通俗来说就是咱们把网址输入进浏览器而后敲回车键开始一直到浏览器把网站的内容呈现给用户的这段时间。网站响应时间是越短越好,由于网站页面打开速度越快,就意味着咱们的用户能够更快的访问站点或者咱们的服务器。通常咱们网站的响应时间保持在100~1000ms便可。1m=1000ms,打开速度越快对用户体验度越好。听说响应时间还会影响到网站SEO效果(请行业专家留言告诉我)。css

响应时间并不能直接反映网站性能的高低,可是在必定程度上反应了网站系统的处理能力,也是给用户最直观上的感觉。若是网站的响应时间过长,好比10秒以上,用户的流失率会大大增长,因此把响应时间控制在必定范围内是提升用户体验度的第一要素。程序员

解决方案

当用户请求一个网站数据的时候,其实是发送了一个http请求,在宏观上能够分为两个部分:redis

  • 1. http请求到达目标网站服务器以前sql

  • 2. http请求到达目标网站服务器以后数据库

若是忽略其中硬件部分和部分细节,请求一个网站数据的大致过程以下图所示(其中CDN和缓存部分能够省略): 浏览器

咱们要想缩短一个网站的响应时间,本质上是提升数据的返回速度,说的直白一点就是要把请求数据过程当中的各个步骤提升速度,这样总体下来响应时间就会缩短。缓存

把数据放在离用户越近的地方响应时间越快服务器

客户端

客户端是发起一个网站请求的源头,其实这个源头能够施加必定的策略来大大缩短某些数据的获取时间。其中最为经常使用的就是缓存,一些经常使用的,不多变更的资源缓存在客户端,不但能缩短获取资源的时间,并且在很大程度上能减轻服务端的压力。好比一些图片,css,js文件,甚至一些接口的数据或者整个网页内容均可以在客户端作缓存。另外http请求的合并也能够减小对服务端的请求次数,在必定程度上能够缩短请求的响应时间。网络

DNS

通常网站的访问方式都采用域名的方式(不多见IP方式),既然是域名就涉及到DNS解析速度的问题,若是DNS服务解析的速度比较慢,总体过程的响应时间也会加长,不过这个过程其实不多出现慢的问题(不是说没有)。并发

网络

客户端获取到网站IP以后经过网卡把Http请求发送出去,目标地址为相应的网站服务器。在这个过程中若是客户端和服务器端有一方带宽比较小的话,就会加大响应时间。我司曾经就由于服务器带宽太小致使客户端响应时间很长的状况,当时排查了很长时间才发现。

固然网络是不可靠的,这个过程的响应时间其实取决于不少因素,好比路由器的路由策略是否最优,整个过程经过的网关数据量等。因此有不少网站实际上是多地区多机房部署的,目的就是为了让用户经过很短的网络路径就能到达网站(其实这个过程运营商的选择也有影响)。

网站

当一个请求到达网站服务器,服务器便开始处理请求,通常会有专门处理业务请求的一个业务层,有的体现为rpc协议的微服务,有的体现为简单的一个代码分层。最终请求的数据会经过查询数据库来返回。其实这个过程和车站购票流程同样,每一个窗口的处理能力是有限的,对应到服务器处理能力。因为这个缘由,因此诞生了负载均衡的策略,核心思想就是:分。一台服务器不够,那就两台,三台,四台..... 直到并发的全部请求的响应时间都在可控范围以内。

数据库的状况相似,一个数据库扛不住压力,就加到N个数据库分散压力。一个表扛不住压力,就把这个表拆分开,拆分红多个表,甚至拆分到多个不一样服务器数据库,这就是咱们经常使用的拆表策略。有的时候在同一个数据库中进行表拆分,性能的提高并不是最大化,由于一台服务器的磁盘IO是有上限的,就算拆成100个表,仍是在同一个物理磁盘上,固然这样可缓解锁单表的状况。

如今有不少的场景采用NOsql代替关系型数据库来缩短响应时间,在正常状况下,因为关系型数据库的自己因素在特定场景下的读写速度比Nosql要慢不少,因此系统设计初期,能够考虑采用关系型数据库和Nosql混用的方案。

缓存

当并发的请求到达必定程度,瓶颈大部分状况下发生在DB层面,甚至DB不管怎么优化总有上限。为了不频繁查询数据库产生瓶颈,诞生了缓存。在访问数据库以前加入了缓存层,固然这里的缓存采用的方案在数据的响应时间上要比数据库小不少,好比经常使用的redis,Memcache,可是这些第三方的缓存组件仍是要走网络,比起进程内的缓存仍是要慢的多。

如今通常流行的设计在网站层和服务层都有缓存策略,只不过缓存的数据和策略有所不一样,可是最终目的都是为了加快请求的响应。固然加了缓存以后,数据的一致性须要仔细设计才能够,若是发生数据不一致的状况,程序员可能要背锅了。

缓解数据库压力并非引入缓存的惟一因素。

CDN加速

一些小厂可能用不到cdn,可是cdn带来的加速仍是很客观的。cdn依靠部署在各地的边缘服务器,经过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,下降网络拥塞,提升用户访问响应速度和命中率。CDN就是把离用户最近的数据返回给用户。

写在最后

程序异步化其实并不能缩短响应时间,可是对提升吞吐量有很大做用。

相关文章
相关标签/搜索