大牛带你进行程序员架构修炼:架构设计——高性能设计
Posted king哥Java架构
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大牛带你进行程序员架构修炼:架构设计——高性能设计相关的知识,希望对你有一定的参考价值。
高性能设计
下面从用户、开发者和运维人员的视角,来看看他们关注的性能是什么。
从用户的视角来看,性能相当于从提交请求到看到页面的时间。
不同计算机的性能差异,不同浏览器解析 html 的速度差异,以及不同网络提供商提供的互联网服务的速度差异,等等,都会导致从提交请求到看到页面的时间远大于服务器处理请求的时间。在实践中,我们可以采用一些前端架构优化手段,例如优化 HTML 样式,利用浏览器异步和并发的特性,调整缓存策略,使用 CDN 服务、反向代理等,使用户尽快看到内容,即使不对应用服务进行优化,也能够很好地改善用户的体验。
从开发者的视角来看,性能的重点在于应用服务器的性能,包括响应延迟、系统吞吐量、并发处理、系统稳定性等,主要的优化手段是利用缓存加速数据读取,使用集群提高吞吐量,使用异步加快请求响应,优化代码改善程序,等等。
从运维人员的视角来看,性能相当于一些基础设施的性能和利用率。
主要的性能测试指标
主要的性能测试指标有响应时间、并发数、吞吐量、性能计数器等,下面分别进行讲解。
◎ 响应时间:指从发出这个请求开始到接收到数据的时间,在一般情况下,这个时间都非常短,甚至不超过测试的误差值,所以我们可以采用重复请求的方式来获取具体的响应时间,比如请求10万次,并记录总时间,然后计算出单次请求的时间。
◎ 并发数指:指能够同时处理的请求数目,对于网站而言就是并发用户数。其中,网站系统用户数 > 网站在线用户数 > 网站并发用户数。
◎ 吞吐量:指在单位时间内能够处理的请求数,体现了系统的整体处理能力。衡量指标有很多,可以是每秒请求数、每秒页面数、每天的访问人数及每小时处理的业务数等。常用的量化指标有 TPS(每秒事务数)、HPS(每秒 HTTP 请求数)、QPS(每秒查询数)等。
◎ 性能计数器:指描述服务器或操作系统的一些性能指标,包括系统负载(System Load)、线程数、内存使用、磁盘和网络I/O等,当这些值超过警告值(安全临界值)时,就会向开发运维人员告警,通知其及时处理异常。
性能测试方法
性能测试是一个统称,具体可以分为性能测试、负载测试、压力测试和稳定性测试。
◎ 性能测试:指以初期设计的指标为预期目标,不断对系统施压,看系统在预期的范围内能否达到预期的性能。
◎ 负载测试:指对系统不断增加并发请求以增加系统压力,直到系统的某项或多项指标达到安全临界值,这时继续对系统施加压力,
系统的处理能力会有所下降。
◎ 压力测试:指在超过安全负载的情况下继续施压,直到系统崩溃或不再能够处理任意请求,以此来计算系统能承受的最大压力。
◎ 稳定性测试:指在一定的压力(不均匀施压)下,系统能够稳定运行较长时间。
如下图所示,a到b区间就是网站日常的运行区间,服务处理大多在这一区间内;c点相当于系统的最大负载点;b到c区间指访问量因某些原因超过了日常访问压力;超过了c点后,继续增加压力,这时系统的性能开始下降,但是资源消耗会更多,直到d点(系统的崩溃点),超过d点继续加压的话,系统将不能处理任何请求。
性能测试反映的是系统的处理能力,与其对应的是用户的等待时间(响应时间),如下图所示。
上图中的点与上上图中的点相互对应,直到系统崩溃,用户失去响应。
性能优化策略
根据系统分层架构,性能优化可分为 We b 前端性能优化、应用服务器性能优化和存储性能优化。
1.Web前端性能优化
对于Web前端,可以从浏览器访问、CDN、代理服务器这三方面进行性能优化。
1)浏览器访问优化浏览器访问优化的主要方法如下。
◎ 减少HTTP请求数,主要通过合并CSS、javascript和图片实现。
◎ 使用浏览器端缓存。在某些时候,对静态资源文件的编写需要及时应用到客户端浏览器,可通过改变文件名实现。
◎ 启用页面压缩,文本文件的压缩效率可达80%以上。
◎ 将CSS放在页面最上面,将JavaScript放在页面最下面。
◎ 减少Cookie传输,可以考虑通过独立域名来传输Cookie。
如果你觉得自己学习效率低,缺乏正确的指导,可以加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧!
[Java架构群]
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的JAVA交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
2)CDN
C D N(内容分发网络)在本质上也属于缓存,指将数据缓存在离用户近的地方,使用户尽快获取数据,因为 CDN 都部署在网络运营商的机房中,这些运营商同时为用户提供网络服务,因此用户请求的路由会优先到达 CDN 服务器,如果存在请求的资源,就直接返回,以最短路径返回响应,加快用户的访问速度,还能够为中心机房减轻压力。
CDN 一般用来缓存静态资源、CSS、JavaScript 脚本、静态页面、图片等,这些内容的修改频率很低但是访问请求频率很高,因此放在CDN上能够很好地改善访问速度。
3)代理服务器
传统的代理服务器是当用户请求不到想要的资源时,由代理服务器帮用户请求,用户知道自己请求的最终服务器是谁,比如VPN通过代理服务器将请求转发到站外服务网络。而反向代理是当用户请求一个地址时,用户请求的是反向代理服务器,然后由反向代理服务器请求其他服务器获取内容,用户不知道最终是从哪一台服务器获取的数据。反向代理Web服务器接收HTTP请求,然后进行请求转发,在获取内容后将内容返回给用户,用户只知道是由反向代理服务器给自己的数据,而不知道数据源最终是从哪个服务器来的。反向代理服务器具有保护作用,来自互联网的请求都需要经过反向代理服务器,相当于在We b服务器之间建立起一道屏障。
除安全外,可以在反向代理服务器上进行一些静态资源的缓存,以此来加快访问速度,减轻应用服务器的负载压力。
当然,也可以将某些动态资源缓存在代理服务器上,比如热门的词条、帖子、博客等,这些资源的请求量可能非常大,如果每次都走一遍流程的话,就会带来很大的压力。同时,当这些动态内容发生改变时,会通知反向代理服务器缓存失效,代理服务器会重新缓存动态资源。
除此之外,反向代理服务器还可以用来做负载均衡,通过负载均衡来构建服务器集群,以此来提高系统的总体处理能力,进而提高应用服务器处理高并发的能力。
2.应用服务器的性能优化
应用服务器就是处理网站业务的服务器,网站的业务代码都部署在这里,主要的优化手段有缓存、集群、异步等。
3.存储性能优化
可以考虑使用分布式存储、磁盘阵列和HDFS(Hadoop)。
写在最后
给大家分享一篇一线开发大牛整理的java高并发核心编程神仙文档,里面主要包含的知识点有:多线程、线程池、内置锁、JMM、CAS、JUC、高并发设计模式、Java异步回调、CompletableFuture类等。
码字不易,如果觉得本篇文章对你有用的话,请给我一键三连!关注作者,后续会有更多的干货分享,请持续关注!
以上是关于大牛带你进行程序员架构修炼:架构设计——高性能设计的主要内容,如果未能解决你的问题,请参考以下文章