当前位置: 首页 > 科技观察

哪些技能产品经理不会提,但技术人必须懂?

时间:2023-03-14 10:12:58 科技观察

缓存是构建高性能高并发系统的必备手段之一。通常用于解决性能瓶颈。是程序员必备的知识点,也是面试必备的考点。虽然产品经理很可能不会关注系统性能,但程序员在实现需求时,必须考虑系统的并发量和用户承载量。缓存主要用来解决性能瓶颈问题,一旦使用不当,会导致系统崩溃。今天,我们通过4W系统的总结一下缓存相关的理论知识。随着互联网业务的快速迭代和用户数量的激增,应用架构需要不断调整甚至重构以适应该业务的快速发展。当数据量快速增长,业务逻辑变得更加复杂,服务链路不断增加等一系列问题会导致RT过长,需要逐步提升服务性能以满足更好的需求用户体验。在优化系统架构的时候,通常有scaleup和scaleout两种方式。向外扩展通常称为水平扩展。将应用服务设计成无状态的,可以方便横向扩展,通过增加硬件来分解访问压力。而scaleup则是通过提升单个服务链路的性能来提升QPS和系统吞吐量。在追求更好的性能时,大部分业务场景都是读多写少,一般通过引入缓存来解决。1.What——什么是缓存?缓存在wiki中的定义是:复制原始值的数据集合,存储在计算机的其他地方,通常是为了更容易访问。简单的理解就是在电脑设备中保存数据的副本,方便以后快速访问。从定义上可以看出,所谓的缓存对于已有数据的一份副本是必须存在的,也可以看出使用缓存是为了解决快速访问数据(读取数据)的场景。在现有的互联网应用中,缓存的使用是提高服务快速响应的关键技术,也是产品经理无暇顾及的非功能需求。在设计技术方案时,需要对业务场景有一定的前瞻性评估。,来决定是否需要在技术架构中引入缓存来解决这种非功能性需求。缓存在计算机领域有很多实际案例。比如CPU缓存就是为了解决CPU运算速度和内存读取数据不平衡的问题。CPU运算速度远快于内存读写速度。为了减少CPU等待数据读写的时间,在CPU中引入了L1/L2/L3多级缓存。另一个例子是Linux中的文件缓存。其实我们在编程的时候都会说到数据的内存地址,但是我们接触到的是虚拟地址,而不是真实的物理地址。计算机中的内存管理单元(MMU)和页表将虚拟地址转换为物理地址。在计算机硬件领域,已经出现了很多缓存的应用案例。事实上,软件架构中缓存的设计会借鉴很多传统的、成熟的计算机硬件缓存设计思想。2.Why——为什么需要使用缓存?软件服务能够获得用户的信任,为用户带来产品的价值,能够解决目标用户的痛点。这是决定用户是否会在一开始就决定使用它,即在中提到产品能给用户带来“啊哈时刻”,它决定了用户是否会频繁、持续地使用它。用户体验被认为是软件产品增加用户粘性的关键因素。2.1什么是用户体验?直到1990年代,用户体验都是根据需要进行专业定义和推广的,由唐纳德·诺曼(DonaldNorman)宣扬和推广。用户体验在人机交互领域一直受到重视,一度与传统的三大可用性指标(即效率、效果、基本满意度)相媲美。ISO9241-210标准正式将用户体验定义为:人们对正在使用或预期使用的产品、系统或服务的认知印象和反应。可见,用户体验是用户对软件产品的主观感受,具体包括用户在使用前、使用中和使用后的情绪、偏好、认知印象、心理反应和情绪表达等。每个用户对产品的主观感受都有不同的看法,侧重的角度也不同,这就导致软件产品要让大多数用户获得良好的用户体验,这本身就是一件非常具有挑战性的事情。在大多数行业中,用户体验分为三类:用户状态、软件产品的系统性能和环境、用户状态和环境(同类产品中的用户环境和产品环境)。交互设计、用户研究等多个专业领域的学生需要攻克问题,而软件开发人员则需要解决系统性能问题。对于用户来说,最基本的要求就是在使用软件服务时,软件产品所提供的服务内容的时效性,也就是通常所说的使用过程中的持续加载,必然会导致用户体验不佳。内容的及时性也是对系统性能的最低要求。系统性能的问题是产品经理无暇顾及的一个点,也是一个需要开发人员花时间思考的非功能需求。评价系统性能的指标有很多。在提升用户体验的前提下,我们需要关注哪些性能指标?2.2常用性能指标设计软件架构时需要注意的几个常用指标:响应时间、延迟、吞吐量、并发用户数、资源利用率。1)系统响应时间:响应时间是指系统响应用户请求所花费的时间。不同的功能有不同的链路长度,同一功能的不同数据量会导致不同的响应时间。因此,在衡量系统响应时间时,通常关注软件产品所有功能的平均响应时间和最大响应时间。2)Latency:在讨论系统响应时间时,更细粒度的划分可以分为:客户端接收数据进行渲染时的内容“渲染时间”;服务器接受用户请求并发送给服务器和服务器发送数据返回给客户端涉及的两个过程:网络传输时间和应用延迟时间。应用延迟时间是服务器执行整个服务链路所花费的时间,也是性能优化降低的第一时间。3)吞吐量:吞吐量是指单位时间内可以处理的请求数。对于没有并发的应用程序,吞吐量与请求响应时间成反比。服务延迟越长,系统吞吐量越低。4)并发用户数:并发用户数是指系统可以同时承载并正常使用系统功能的用户数。与吞吐量相比,这个指标更笼统,但对于非软件领域的人来说更容易理解。5)资源利用率:资源利用率反映了一段时间内资源被占用的情况。2.3缓存带来的优势在追求更好的优化体验时,客观来说,需要不断提升以上性能指标,才能不断逼近系统体验的最优解。缓存有什么样的优势,是否值得我们去设计一个能够很好适应当前业务场景的缓存结构?1)大幅提升软件用户体验软件产品主要围绕两个核心问题,一是解决目标用户的痛点,二是增加产品粘性。在提供软件服务时,从抽象的角度来看,就是解决整个链路上的数据流转问题。如何让数据流转更高效顺畅,是实施过程中关注的重点。其实无论是浏览器还是负载均衡、应用服务器、数据库等,都会应用缓存。当数据离用户“更近”时,比如数据副本在客户端,就意味着可以快速响应请求,并据此将数据呈现给用户。耗时更短。如今,用户爸爸们每天都在“管着各种事情”。如果一个软件产品不能在短时间内抓住用户的眼球,很可能就意味着失败。因此,使用缓存可以让用户在主观上获得更好的用户体验。2)提高吞吐量想象一下,如果请求能够在服务链路上获取到缓存中的服务数据,那么意味着很多数据不需要从源应用服务器获取,从而降低了源的网络传输频率服务器。在一定的IDC带宽下,系统可以减少网络传输时间和应用延迟时间,从而支持更多的系统接入,提高系统整体吞吐量和并发用户数,硬件使用效率也将得到显着提升。从实际场景来看,在优化系统性能的时候,大概率会优先选择缓存进行系统优化,这也是一种行之有效的方法。缓存也被认为是一种“以空间换时间”的艺术。3.Where——缓存存在于链接的什么地方?3.1缓存分类从一个请求到最终的响应,会有很多环节,而缓存几乎可以存在于整个环节的每一个节点。缓存可以按照不同的维度分类如下:1)缓存所在链路节点的位置:客户端缓存、网络缓存、服务器缓存2)缓存架构部署方式:单机缓存缓存集群分布式缓存3)缓存的内存区域有localCache/In-processcacheInter-processcacheRemotecache是??根据缓存在服务链路上的位置来划分的,可以系统的梳理出缓存的不同应用。3.2客户端缓存客户端缓存是一种离用户“最近”的存储介质。它通常与网络测试和服务器端缓存一起使用。常见的客户端缓存有以下几种:1)页面缓存:页面缓存是指将静态页面获取页面中的一些元素缓存在本地,这样下次请求就不需要重复资源文件了。H5很好的支持离线缓存功能。具体实现可以通过页面指定manifest文件。当浏览器访问带有manifest属性文件的文件时,会先从应用缓存中获取加载页面的资源文件,通过检查机制处理缓存更新问题。2)浏览器缓存:浏览器??缓存通常会开辟内存空间专门用于存放资源副本。当用户备份或返回上一步时,可以通过浏览器缓存快速获取数据。在HTTP1.1中引入了e-tag标签,结合expire和cache-control两个特性可以很好的支持浏览器缓存。更多关于浏览器缓存的详细知识,请参考这篇文章。3)APP缓存:APP可以在内存或本地数据库中缓存内容。例如,一些开源图片库具有缓存的技术特性。当从远程服务器获取图片等资源文件时,会将其缓存起来,以备下次使用。然后重复请求,减少用户的流量费用。客户端缓存是前端性能优化的一个重要方向。毕竟,客户端是离“用户”最近的地方,是可以充分挖掘优化潜力的地方。3.3网络缓存网络缓存位于客户端和服务器之间,通过代理解决数据请求的响应,降低数据请求的返回率。网络缓存通常有以下几种形式:1)web代理缓存:常见的代理形式分为:正向代理、反向代理和透明代理。Web代理缓存通常是指正向代理,它将资源文件和热点数据放在代理服务器上。当有新的请求到来时,如果可以在代理服务器上获取到数据,就不需要向应用服务器重复请求;2)边缘缓存:和正向代理一样,反向代理也可以用于缓存。例如,nginx提供了缓存功能。更进一步,如果这些反向代理服务器能够与用户请求来自同一个网络,那么获取资源的速度将会进一步提高。这种类型的反向代理服务器可以称为边缘缓存。常见的边缘缓存是CDN(ContentDeliveryNetwork),可以把图片等静态资源文件放在CDN上。3.4服务端缓存服务端缓存是后端开发性能优化的出发点。常见的后端性能优化也是通过引入缓存来解决的。常见的有数据库查询缓存、缓存框架、应用级缓存的引入。3.4.1数据库查询缓存比如MySQL的缓存机制就是缓存SELECT语句和对应的ResultSet。当收到后续的SELECT请求时,如果MySQL开启了QueryCache功能,SELECT语句会以字符串的形式存储起来进行hash,然后从缓存中进行查询。如果查询到数据,直接返回,省去了后续优化器和存储引擎的IO操作,可以大大提高响应时间。如何优化QueryCache需要从以下几个指标来考虑:query_cache_size:设置可以缓存ResultSet的内存区域的大小query_cache_type:表示使用缓存的场景。0表示任何场景都不使用QueryCache,1表示明确指定不使用QueryCache的查询可以使用,2(DEMAND)表示只有明确指定QueryCache才会生效;Qcachehits:表示查询命中了多少次QueryCacheQcacheinserts:表示有多少次QueryCache未被命中并插入数据Qcahcelowmemprunes:表示有多少次查询因空间不足而被清除Qcachefreememory:表示剩余内存sizeQcachefreeblocks:数值大表示内存碎片多,需要及时清理在优化Qcache时,可以综合分析以上指标,比如知道Qcache的缓存命中率=Qcache命中率/Qcache命中率+Qcacheinserts,判断当前Qcache的效率。也可以结合Qcahcelowmemprunes、Qcachefreememory和Qcachefreeblocks来判断当前Qcache的内存使用效率。另外,如果使用Innodb存储引擎,还需要注意innodb_buffer_pool_size这个参数,这个参数决定了Innodb的索引以及数据是否有足够的空间放在缓存中。table_cache决定了最大可以缓存的表数,也是一个需要注意的参数。3.4.2缓存框架在功能开发中,往往会使用提供缓存特性的缓存框架或实现缓存功能的类库来高效完成开发。常见的缓存框架有Ehcache、Guava等,这些缓存框架配置简单,使用简单灵活。这些开源缓存框架不仅支持单机本地缓存,还可以配置集群实现弹性伸缩。3.4.3应用级缓存当缓存框架不能满足需求时,需要引入应用级缓存,例如Redis、MongoDB等NoSQL数据库。具有高可用性和可扩展性的应用级缓存的分布式架构可以支持业务需求。当然,做一个应用级缓存产品的挑战也是巨大的。4.When——什么时候需要使用缓存?缓存不是架构设计必须的,也不是业务开发中必须的功能点。只有当业务出现性能瓶颈,优化性能时,才需要考虑使用缓存来提升系统性能。并不是所有的业务场景都适合缓存。读多写少,对数据时效性要求不高的场景更适合缓存。缓存并不是解决所有性能问题的灵丹妙药。如果滥用缓存,它将成为毒药并引入维护缓存。运行成本使系统更加复杂,不利于维护。另外,使用缓存作为存储是一种极其致命的做法。这种错误的认识,意味着从系统引入缓存的那一刻起,系统就进入了危险境地,缓存的使用边界一定很深。理解,为了保证尽可能的引入缓存是一个正确的决定。在设计缓存结构时,需要考虑的点有很多:1)业务流量水平和应用规模:对于低并发、低流量的应用,引入缓存不会带来明显的性能提升,但会带来复杂度应用和极高的运维成本。并非所有数据都需要缓存。例如,对于图片、视频等文件,使用分布式文件系统比使用缓存更合适。因此,在引入缓存之前,有必要对当前的业务流量进行评估。在高并发、大流量的业务场景中引入缓存,相对收益会更高;2)缓存应用的选择:缓存应用有很多,如Redis、Memcached以及tair等,每种分布式缓存应用的优缺点,以及应用范围、内存效率、运维成本,甚至需要了解团队开发人员的知识结构,才能做出好的技术选型;3)缓存因素正确评估:在引入缓存之前,需要重点评估值大小、缓存内存空间、峰值QPS、过期时间、缓存命中率、读写更新策略、键值分布路由策略、过期时间4)缓存高可用架构:分布式缓存要高可用,这也是分布式系统追求的三大高指标之一,缓存集群设计,主从同步方案设计等.缓存只有足够可靠,才能为业务系统服务,才能为业务带来价值;5)完善的监控平台:当缓存上线时,需要一个监控系统来明确观察缓存系统的运行情况,以便同时针对意外的被低估的热点数据,也需要一个热点发现系统需要解决意外的热数据缓存问题。6)就近缓存原则:将缓存的数据放在离用户最近的地方,无疑会大大提高响应速度,这也是多级缓存设计的核心思想。5、如何正确使用缓存?影响缓存整体性能的大大小小的因素有很多,比如语言本身特性的影响。比如Java需要考虑GC的影响。还需要尽可能提高缓存命中率等方面。核心的几个影响因素是什么?如何正确使用?