49 | 深入浅出网站高性能架构设计

从全局来看,网站的高性能架构设计包括两大部分内容:一是前端性能,二是后端服务器相关的性能优化和架构设计。

前端的高性能架构

参考第 31 篇文章《工欲善其事必先利其器:前端性能测试工具原理与行业常用工具简介》中的相关内容。

后端服务器的高性能架构

后端服务器的高性能架构,业内采用的最主要的技术手段是缓存。同时,集群也可以从计算能力的角度,提升后端的处理性能。

缓存

缓存是指将数据存储在访问速度相对较快的存储介质中,所以从缓存中读取数据的速度更快。

在系统和软件的不同级别对应有不同层级的缓存:

  • 浏览器级别的缓存,会用来存储之前在网络上下载过的静态资源;

  • CDN 本质也是缓存,属于部署在网络服务供应商机房中的缓存;

  • 反向代理服务器本质上同样也是缓存,属于用户数据中心最前端的缓存;

  • 数据库中的“热点”数据,在应用服务器集群中有一级缓存,在缓存服务集群中有二级缓存;

  • 甚至是用于 URL 和服务器 IP 地址转换 DNS 服务器,为了减少重复查询的次数也采用了缓存。

缓存主要用来存储那些相对变化较少,并且遵从“二八原则”的数据。这里的“二八原则”指的是 80% 的数据访问会集中在 20% 的数据上。

缓存技术并不适用于那些需要频繁修改的数据。

分布式缓存架构的主流技术方案有两种:

在企业级应用中广泛采用的 JBoss Cache。JBoss Cache 需要在缓存集群中的每台机器上同步所有缓存的副本,当集群规模比较大的时候,同步代价会很高。而且,多份副本也会造成存储资源的浪费。但其最大的优点是速度非常快,所以 JBoss Cache 更适用于企业级规模不是很大的缓存集群。这种企业级的集群一般在几台到十几台服务器的规模。

在互联网应用的主流 Memcached。Memcached 属于互不通信的分布式架构,集群中各个节点缓存的数据都不一样,缓存使用者基于 Hash 一致性算法来定位具体的内容到底缓存在集群中的哪个节点。

从测试人员的视角来看看,在执行测试时需要考虑到哪些与缓存相关的测试场景:

  • 对于前端的测试场景,需要分别考虑缓存命中和缓存不命中情况下的页面加载时间。

  • 基于缓存过期测试策略的设计,需要考虑到必须要重新获取数据的测试场景。

  • 需要针对可能存在的缓存“脏数据”,进行有针对性的测试。缓存“脏数据”,是指数据库中的数据已经更新,但是缓存中的数据还没来得及更新的场景。

  • 需要针对可能的缓存穿透进行必要的测试。缓存穿透,是指访问的数据并不存在,所以这部分数据永远不会有被缓存的机会,因此此类请求会一直重复访问数据库。

  • 系统冷启动后,在缓存预热阶段的数据库访问压力是否会超过数据库实际可以承载的压力。

  • 对于分布式缓存集群来说,由于各集群使用的缓存算法不同,那么如果要在缓存集群中增加更多节点进行扩容的话,扩容对原本已经缓存数据的影响也会不同。所以,我们需要针对缓存集群扩容的场景,进行必要的测试和性能评估。

集群

当一台服务器不足以满足日益增长的用户流量时,我们就可以考虑使用多台服务器来组成一个集群:外部请求将统一和负载均衡器打交道;负载均衡器根据不同的负载调度算法,将访问请求传递给集群中的某台服务器处理。

互联网应用“牲口”模式服务器额外的测试关注点:

  • 集群容量扩展。也就是说,集群中加入新的节点后,是否会对原有的 session 产生影响。

  • 对于无状态应用,是否可以实现灵活的实效转移。

  • 对于基于 session 的有状态应用,需要根据不同的 session 机制验证会话是否可以正常保持,即保证同一 session 始终都有同一个确定的节点在处理。

  • 当集群中的一个或者多个节点宕机时,对在线用户的影响是否符合设计预期。

  • 对于无状态应用来说,系统吞吐量是否能够随着集群中节点的数量呈线性增长。

  • 负载均衡算法的实际效果,是否符合预期。高并发场景下,集群能够承载的最大容量。


来源于 极客时间 茹炳晟 软件测试52讲

posted @ 2020-08-17 12:55  捷后愚生  阅读(310)  评论(0编辑  收藏  举报