|
|
前言安防监控的具体问题可以到我们网站了解一下,也有业内领域专业的客服为您解答问题,为成功合作打下一个良好的开端!https://item.taobao.com/item.htm?id=610899018736
接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。该问题说简单也简单,说复杂也复杂。有时候,只需加个索引就能解决问题。有时候,需要做代码重构。有时候,需要增加缓存。有时候,需要引入一些中间件,比如。有时候,需要需要分库分表。有时候,需要拆分服务。等等。。。导致接口性能问题的原因千奇百怪,不同的项目不同的接口,原因可能也不一样。本文我总结了一些行之有效的,优化接口性能的办法,给有需要的朋友一个参考。1索引接口性能优化大家首个想到的可能是:优化索引。没错,优化索引的成本是比较小的。你通过查看线上日志或者监控报告,查到某个接口用到的某条语句耗时比较长。这时你可能会有下面这些疑问:该语句加索引了没加的索引生效了没选错索引了没11没加索引语句中条件的关键字段,或者后面的排序字段,忘了加索引,这个问题在项目中很常见。项目刚开始的时候,由于表中的数据量小,加不加索引查询性能差别不大。后来,随着业务的发展,表中数据量越来越多,就不得不加索引了。可以通过命令:``;能单独查看某张表的索引情况。也可以通过命令:``;查看整张表的建表语句,里面同样会显示索引情况。通过ALTERTABLE命令可以添加索引:ALTERTABLE``ADDINDEX_();也可以通过CREATEINDEX命令添加索引:CREATEINDEX_ON``();不过这里有一个需要注意的地方是:想通过命令修改索引,是不行的。目前在中如果想要修改索引,只能先删除索引,再重新添加新的。删除索引可以用DROPINDEX命令:ALTERTABLE``DROPINDEX_;用DROPINDEX命令也行:DROPINDEX_ON``;12索引没生效通过上面的命令我们已经能够确认索引是有的,但它生效了没此时你内心或许会冒出这样一个疑问。那么,如何查看索引有没有生效呢答:可以使用命令,查看的执行计划,它会显示索引的使用情况。例如:*``='002';结果:通过这几列可以判断索引使用情况,执行计划包含列的含义如下图所示:如果你想进一步了解的详细用法,可以看看我的另一篇文章《|索引优化的这把绝世好剑,你真的会用吗》说实话,语句没有走索引,排除没有建索引之外,比较大的可能性是索引失效了。下面说说索引失效的常见原因:如果不是上面的这些原因,则需要再进一步排查一下其他原因。13选错索引此外,你有没有遇到过这样一种情况:明明是同一条,只有入参不同而已。有的时候走的索引,有的时候却走的索引没错,有时候会选错索引。必要时可以使用来强制查询走某个索引。至于为什么会选错索引,后面有专门的文章介绍的,这里先留点悬念。2优化如果优化了索引之后,也没啥效果。接下来试着优化一下语句,因为它的改造成本相对于代码来说也要小得多。下面给大家列举了优化的15个小技巧:由于这些技巧在我之前的文章中已经详细介绍过了,在这里我就不深入了。更详细的内容,可以看我的另一篇文章《聊聊优化的15个小技巧》,相信看完你会有很多收获。3远程调用很多时候,我们需要在某个接口中,调用其他服务的接口。比如有这样的业务场景:在用户信息查询接口中需要返回:用户名称、性别、等级、头像、积分、成长值等信息。而用户名称、性别、等级、头像在用户服务中,积分在积分服务中,成长值在成长值服务中。为了汇总这些数据统一返回,需要另外提供一个对外接口服务。于是,用户信息查询接口需要调用用户查询接口、积分查询接口和成长值查询接口,然后汇总数据统一返回。调用过程如下图所示:调用远程接口总耗时530=200+150+180显然这种串行调用远程接口性能是非常不好的,调用远程接口总的耗时为所有的远程接口耗时之和。那么如何优化远程接口性能呢31并行调用上面说到,既然串行调用多个远程接口性能很差,为什么不改成并行呢如下图所示:调用远程接口总耗时200=200(即耗时比较长的那次远程接口调用)在8之前可以通过实现C接口,获取线程返回结果。8以后通过CF类实现该功能。我们这里以CF为例:UIUI(L)IE,EE{UII=UI();CFF=CFA(()-{RUAF(,I);BTRUE;},);CFF=CFA(()-{RBAF(,I);BTRUE;},);CFF=CFA(()-{RGAF(,I);BTRUE;},);CFO(F,F,F)();F();F();F();I;}温馨提醒一下,这两种方式别忘了使用线程池。示例中我用到了,表示自定义的线程池,为了防止高并发场景下,出现线程过多的问题。32数据异构上面说到的用户信息查询接口需要调用用户查询接口、积分查询接口和成长值查询接口,然后汇总数据统一返回。那么,我们能不能把数据冗余一下,把用户信息、积分和成长值的数据统一存储到一个地方,比如:,存的数据结构就是用户信息查询接口所需要的内容。然后通过用户,直接从中查询数据出来,不就OK了如果在高并发的场景下,为了提升接口性能,远程接口调用大概率会被去掉,而改成保存冗余数据的数据异构方案。但需要注意的是,如果使用了数据异构方案,就可能会出现数据一致性问题。用户信息、积分和成长值有更新的话,大部分情况下,会先更新到数据库,然后同步到。但这种跨库的操作,可能会导致两边数据不一致的情况产生。4重复调用重复调用在我们的日常工作代码中可以说随处可见,但如果没有控制好,会非常影响接口的性能。不信,我们一起看看。41循环查数据库有时候,我们需要从指定的用户集合中,查询出有哪些是在数据库中已经存在的。实现代码可以这样写:LUU(LUL){(CUE(L)){CL();}LU=LAL();LE(-(MUBI(I())));;}这里如果有50个用户,则需要循环50次,去查询数据库。我们都知道,每查询一次数据库,就是一次远程调用。如果查询50次数据库,就有50次远程调用,这是非常耗时的操作。那么,我们如何优化呢具体代码如下:LUU(LUL){(CUE(L)){CL();}LL=L()(U::I)(CL());MUBI();}提供一个根据用户集合批量查询用户的接口,只远程调用一次,就能查询出所有的数据。这里有个需要注意的地方是:集合的大小要做限制,比较好一次不要请求太多的数据。要根据实际情况而定,建议控制每次请求的记录条数在500以内。42死循环有些小伙伴看到这个标题,可能会感到有点意外,死循环也算代码中不是应该避免死循环吗为啥还是会产生死循环有时候死循环是我们自己写的,例如下面这段代码:(){(){;}S();}这里使用了()的循环调用,这种写法在CAS自旋锁中使用比较多。当满足等于的时候,则自动退出该循环。如果条件非常复杂,一旦出现判断不正确,或者少写了一些逻辑判断,就可能在某些场景下出现死循环的问题。出现死循环,大概率是开发人员人为的导致的,不过这种情况很容易被测出来。还有一种隐藏的比较深的死循环,是由于代码写的不太严谨导致的。如果用正常数据,可能测不出问题,但一旦出现异常数据,就会立即出现死循环。43无限递归如果想要打印某个分类的所有父分类,可以用类似这样的递归方法实现:C(C){(==||PI()==){;}S(父分类名称:+N());C=MCBI(PI());C();}正常情况下,这段代码是没有问题的。但如果某次有人误操作,把某个分类的I指向了它自己,这样就会出现无限递归的情况。导致接口一直不能返回数据,比较终会发生堆栈溢出。建议写递归方法时,设定一个递归的深度,比如:分类比较大等级有4级,则深度可以设置为4。然后在递归方法中做判断,如果深度大于4时,则自动返回,这样就能避免无限循环的情况。5异步处理有时候,我们接口性能优化,需要重新梳理一下业务逻辑,看看是否有设计上不太合理的地方。比如有个用户请求接口中,需要做业务操作,发站内通知,和记录操作日志。为了实现起来比较方便,通常我们会将这些逻辑放在接口中同步执行,势必会对接口性能造成一定的影响。接口内部流程图如下:这个接口表面上看起来没有问题,但如果你仔细梳理一下业务逻辑,会发现只有业务操作才是核心逻辑,其他的功能都是非核心逻辑。在这里有个原则就是:核心逻辑可以同步执行,同步写库。非核心逻辑,可以异步执行,异步写库。上面这个例子中,发站内通知和用户操作日志功能,对实时性要求不高,即使晚点写库,用户无非是晚点收到站内通知,或者运营晚点看到用户操作日志,对业务影响不大,所以完全可以异步处理。通常异步主要有两种:多线程和。51线程池使用线程池改造之后,接口逻辑如下:发站内通知和用户操作日志功能,被提交到了两个单独的线程池中。这样接口中重点关注的是业务操作,把其他的逻辑交给线程异步执行,这样改造之后,让接口性能瞬间提升了。但使用线程池有个小问题就是:如果服务器重启了,或者是需要被执行的功能出现异常了,无法重试,会丢数据。那么这个问题该怎么办呢52使用改造之后,接口逻辑如下:对于发站内通知和用户操作日志功能,在接口中并没真正实现,它只发送了消息到服务器。然后由消费者消费消息时,才真正的执行这两个功能。这样改造之后,接口性能同样提升了,因为发送消息速度是很快的,我们只需关注业务操作的代码即可。6避免大事务很多小伙伴在使用框架开发项目时,为了方便,喜欢使用@T注解提供事务功能。没错,使用@T注解这种声明式事务的方式提供事务功能,确实能少写很多代码,提升开发效率。但也容易造成大事务,引发其他的问题。下面用一张图看看大事务引发的问题。从图中能够看出,大事务问题可能会造成接口超时,对接口的性能有直接的影响。我们该如何优化大事务呢少用@T注解将查询()方法放到事务外事务中避免远程调用事务中避免一次性处理太多数据有些功能可以非事务执行有些功能可以异步处理文章源自苏三说技术 |
|