0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

性能优化之路总结

京东云 来源:jf_75140285 作者:jf_75140285 2024-06-17 15:00 次阅读

针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。



一、接口优化方案总结

1.批处理

批量思想:批量操作数据库,这个很好理解,我们在循环插入场景的接口中,可以在批处理执行完成后一次性插入或更新数据库,避免多次IO。

//批量入库 batchInsert();

2.异步处理

异步思想:针对耗时比较长且不是结果必须的逻辑,我们可以考虑放到异步执行,这样能降低接口耗时。

例如一个理财的申购接口,入账和写入申购文件是同步执行的,因为是T+1交易,后面这两个逻辑其实不是结果必须的,我们并不需要关注它的实时结果,所以我们考虑把入账和写入申购文件改为异步处理。如图所示:



至于异步的实现方式,可以用线程池,也可以用消息队列,还可以用一些调度任务框架。

3.空间换时间 (缓存)

一个很好理解的空间换时间的例子是合理使用缓存,针对一些频繁使用且不频繁变更的数据,可以提前缓存起来,需要时直接查缓存,避免频繁地查询数据库或者重复计算。

需要注意的事,这里用了合理二字,因为空间换时间也是一把双刃剑,需要综合考虑你的使用场景,毕竟缓存带来的数据一致性问题也挺令人头疼。

这里的缓存可以是R2M,也可以是本地缓存、memcached,或者Map。

举一个股票工具的查询例子:

因为策略轮动的调仓信息,每周只更新一次,所以原来的调接口就去查库的逻辑并不合理,而且拿到调仓信息后,需要经过复杂计算,最终得出回测收益和跑赢沪深指数这些我们想要的结果。如果我们把查库操作和计算结果放入缓存,可以节省很多的执行时间。如图:



4.预处理

也就是预取思想,就是提前要把查询的数据,提前计算好,放入缓存或者表中的某个字段,用的时候会大幅提高接口性能。跟上面那个例子很像,但是关注点不同。

举个简单的例子:理财产品,会有根据净值计算年化收益率的数据展示需求,利用净值去套用年化收益率计算公式计算的逻辑我们可以采用预处理,这样每一次接口调用直接取对应字段就可以了。

5.池化思想

我们都用过数据库连接池,线程池等,这就是池思想的体现,它们解决的问题就是避免重复创建对象或创建连接,可以重复利用,避免不必要的损耗,毕竟创建销毁也会占用时间。

池化思想包含但并不局限于以上两种,总的来说池化思想的本质是预分配与循环使用,明白这个原理后,我们即使是在做一些业务场景的需求时,也可以利用起来。

比如:对象池

6.串行改并行

串行就是,当前执行逻辑必须等上一个执行逻辑结束之后才执行,并行就是两个执行逻辑互不干扰,所以并行相对来说就比较节省时间,当然是建立在没有结果参数依赖的前提下。

比如,理财的持仓信息展示接口,我们既需要查询用户的账户信息,也需要查询商品信息和banner位信息等等来渲染持仓页,如果是串行,基本上接口耗时就是累加的。如果是并行,接口耗时将大大降低。

如图:



7.索引

加索引能大大提高数据查询效率,这个在接口设计之出也会考虑到,这里不再多赘述,随着需求的迭代,我们重点整理一下索引不生效的一些场景,希望对小伙伴们有所帮助。

具体不生效场景不再一一举例,后面有时间的话,单独整理一下。



8.避免大事务

所谓大事务问题,就是运行时间较长的事务,由于事务一致不提交,会导致数据库连接被占用,影响到别的请求访问数据库,影响别的接口性能。

举个例子:

@Transactional(value = "taskTransactionManager", propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = {RuntimeException.class, Exception.class}) public BasicResult purchaseRequest(PurchaseRecord record) { BasicResult result = new BasicResult(); ... pushRpc.doPush(record); result.setInfo(ResultInfoEnum.SUCCESS); return result; }

所以为避免大事务问题,我们可以通过以下方案规避:

1,RPC调用不放到事务里面

2,查询操作尽量放到事务之外

3,事务中避免处理太多数据

9.优化程序结构

程序结构问题一般出现在多次需求迭代后,代码叠加形成。会造成一些重复查询、多次创建对象等耗时问题。在多人维护一个项目时比较多见。解决起来也比较简单,我们需要针对接口整体做重构,评估每个代码块的作用和用途,调整执行顺序。

10.深分页问题

深分页问题比较常见,分页我们一般最先想到的就是 limit ,为什么会慢,我们可以看下这个SQL:

select * from purchase_record where productCode = 'PA9044' and status=4 and id > 100000 limit 200

这样优化的好处是命中了主键索引,无论多少页,性能都还不错,但是局限性是需要一个连续自增的字段

11.SQL优化

sql优化能大幅提高接口的查询性能,由于本文重点讲述接口优化的方案,具体sql优化不再一一列举,小伙伴们可以结合索引、分页、等关注点考虑优化方案。

12.锁粒度避免过粗

锁一般是为了在高并发场景下保护共享资源采用的一种手段,但是如果锁的粒度太粗,会很影响接口性能。

关于锁粒度:就是你要锁的范围有多大,不管是synchronized还是redis分布式锁,只需要在临界资源处加锁即可,不涉及共享资源的,不必要加锁,就好比你要上卫生间,只需要把卫生间的门锁上就可以,不需要把客厅的门也锁上。

错误的加锁方式:

//非共享资源 private void notShare(){ } //共享资源 private void share(){ } private int right(){ notShare(); synchronized (this) { share(); } }



二、最后

接口性能问题形成的原因思考

我相信很多接口的效率问题不是一朝一夕形成的,在需求迭代的过程中,为了需求快速上线,采取直接累加代码的方式去实现功能,这样会造成以上这些接口性能问题。

变换思路,更高一级思考问题,站在接口设计者的角度去开发需求,会避免很多这样的问题,也是降本增效的一种行之有效的方式。

以上,共勉!

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8279

    浏览量

    150056
  • SQL
    SQL
    +关注

    关注

    1

    文章

    751

    浏览量

    43916
收藏 人收藏

    评论

    相关推荐

    HBase性能优化方法总结

    hbase响应速度;9. 避免出现region热点现象,启动按照table级别进行balance。以上是对HBase性能优化方法的概要总结,有HBase性能
    发表于 04-20 17:16

    针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结 前言代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑
    发表于 06-19 21:03

    css的性能优化重点

    网站前端性能优化之javascript和css
    发表于 10-21 09:12

    web常用的性能优化

    web常用性能优化
    发表于 06-13 10:57

    Cyclone V SoC FPGA学习之路

    Cyclone V SoC FPGA学习之路第二章:硬件篇(内部资源)前言上一章了解了《cycloneV device datasheet》,其中数据手册里重点介绍了电源要求,时序参数性能等。下面
    发表于 07-23 07:06

    电机控制中对程序算法优化的办法总结

    (用到了三角函数)都比较消耗电机主控芯片的计算能力。在考虑算法实现的时候,都需要针对主控芯片的实际性能进行一定优化,才能确保算法能够顺利运行。这里我总结下电机控制中对程序算法优化的办法
    发表于 09-07 06:19

    《现代CPU性能分析与优化》---精简的优化

    来提高程序的性能。由于这本书是Denis在easyperf.net博客分享内容的系统整理和总结。更加偏向实战类型,在阅读过程中,可以直接对自己的C/C++代码进行剖析和优化实验。当然这本书也是有缺点
    发表于 04-18 16:03

    一文带你详解芯片--SL8541e-系统性能优化

    背景 伙伴反馈,设备操作卡顿,OH基础系统版本应用操作慢,应用人机交互体验差。本文为你总结芯片解决方案–SL8541e-系统性能优化。主要内容包括: *1. 确定优化思路 帧率
    发表于 08-22 09:12

    GPRS优化思路总结报告

    GPRS优化思路总结报告:一、概述 2二、无线优化的思路 2三、(E)GPRS网络资源容量分析优化 53.1、(E)GPRS网络拓扑结构 63.
    发表于 07-27 21:29 26次下载

    DSP程序优化总结

    DSP程序优化总结
    发表于 10-23 14:24 2次下载
    DSP程序<b class='flag-5'>优化</b><b class='flag-5'>总结</b>

    Linux CPU的性能应该如何优化

    在Linux系统中,由于成本的限制,往往会存在资源上的不足,例如 CPU、内存、网络、IO 性能。本文,就对 Linux 进程和 CPU 的原理进行分析,总结出 CPU 性能优化的方法
    的头像 发表于 01-18 08:52 3275次阅读

    TD-LTE网络优化经验总结解析

    TD-LTE网络优化经验总结解析说明。
    发表于 04-27 10:30 23次下载

    DC-DC电源系统的优化设计总结

    DC-DC电源系统的优化设计总结(电源技术期刊咋样)-该文档为DC-DC电源系统的优化设计总结文档,是一份不错的参考资料,感兴趣的可以下载看看,,,,,,,,,,,,,,,,,
    发表于 09-22 11:45 26次下载
    DC-DC电源系统的<b class='flag-5'>优化</b>设计<b class='flag-5'>总结</b>

    单片机学习之路一些常见的疑问也是我的个人学习总结

    单片机学习之路一些常见的疑问也是我的个人学习总结
    发表于 11-14 11:51 22次下载
    单片机学习<b class='flag-5'>之路</b>一些常见的疑问也是我的个人学习<b class='flag-5'>总结</b>

    单片机学习之路一些常见的疑问也是我的个人学习总结

    单片机学习之路一些常见的疑问也是我的个人学习总结
    发表于 11-14 15:21 12次下载
    单片机学习<b class='flag-5'>之路</b>一些常见的疑问也是我的个人学习<b class='flag-5'>总结</b>