我用两个方法就将接口响应时间从2s优化到了100ms

微服务架构下提示工程的优化案例:如何将提示的响应时间从5s降到500ms? 在微服务架构中,提示工程作为AI服务的入口,其响应时间直接决定了用户体验与系统吞吐量。本文以某电商平台商品推荐提示服务的优化案例为核心,结合第一性原理与系统动力学,拆解响应时间的组成瓶颈(网络延迟、同步调用、模型推理 overhead),通过分层缓存策略异步化改造分布式追踪与资源隔离四大核心手段,将提示响应时间从5秒压缩至500毫秒(提升10倍)。 阅读详情

一、背景

事情的背景就是产品初期,需求急、周期短,同事在完成该需求时以结果导向为主,先实现需求。

就在最近,测试时发现该接口的响应为 2s 多,页面中可以感觉到明显的延迟,所以有了本文,提升一下接口响应速度。

在工作中一定要有产品思维,站在用户的角度,怎么做才能更好。只有当自己站在一个更高的层面,才不会让你受制于当下,并助你突破现状。

先说一下目前的代码逻辑,概括一下就是最外层一个循环,然后循环里面查询数据库,而且是一次循环最少 4 次数据库查询。

  • 根据查询条件获取一个总的 list。

  • 遍历该 list,读取每个对象中的属性值。

  • 根据每个对象属性值再去数据库中获取该子对象。

  • 封装返回数据。

上述代码是根据实际业务改造的,实际业务还是个嵌套的循环,就拿上图中的代码为例,如果让你来优化,你想选择哪些优化方式呢?欢迎评论区交流一下。

二、接口优化

先说下我对于接口提升响应速度解决思路吧。首先想到的是定位代码哪个位置慢,其次慢的原因是什么,最后选择合适的方案解决问题。

  • 使用 Arthas 定位代码处理慢的点。

  • 选择适合的优化方案。

  • 测试优化结果。

对于 Arthas 不了解的可以自己扩展学一下,这里不做过多介绍,只说一句,这是个在线解决生产问题的 Java 诊断工具。

2.1、定位

对于这个 test 方法我是这样做的,Idea 中有个 Arthas 插件,所以我们直接在 Idea 中复制对应的命令,粘贴到 Arthas 中进行监控,此处使用的是 trace 命令。

test 方法名位置,右键选择 Arthas Command 中的 Trace 或者 Trace Multiple Class Method Trace -E 命令进行复制。

将该命令粘贴到 Arthas 的终端之后,发起对该接口的请求,即可看到每一行代码花费的时间,此处我拿一个其他接口来做示例,参考如下:

在这个图片中,我们重点关注红框起来的位置,此处打印了该处代码处理时间的占比,占比越高处理时长越长。所以我们只需要关注一下大头,也就是占比多的代码位置进行优化,该接口的响应速度肯定可以提升。

上图中代码位置已经脱密处理,在实际的接口调用栈打印中,每一行输出的末尾都会有代码所在行数。

2.2、分析

通过上图中使用 Arthas 工具的定位,已经知道了方法中哪一块是处理比较慢的,现在只需要梳理业务逻辑,进行优化即可了。

就以文章开头的 test 方法举例,我的优化方案如下:

  • 循环遍历时多次查询数据库进行合并,尽量减少数据库链接查询次数,调用数据库查询代码移动到循环外。

  • 根据遍历的对象属性获取数据库中对应信息时,改为 in 查询,多条 SQL 合并为一条 SQL。

  • 根据查询 SQL 中使用的参数,创建对应的索引,并确保索引生效。

所以简单概括优化方案就是:使用 IN 查询、避免循环查询数据库、增加索引三种方式。

修改之后的代码结构如下:

  • 根据查询条件获取基础对象。

  • 取出 list 中某一个值例如 aid,生成新 list,当作下一次查询的查询条件。

  • 封装对应数据。

最后就是根据查询条件增加索引,这个本文就不再详细说明了,可以参考之前的一篇索引优化文章进行创建,文章链接我放下面。

MySQL 常见的索引优化方案有哪些

2.3、小结

通过使用 In 查询,减少循环中调用数据库,创建索引等手段,再次请求同一个接口,实现了 2s 到 100ms 的优化。其中索引加入之后,速度快了一倍达到 1s 左右,再通过业务逻辑重构最终实现 100ms 的接口响应速度。

留个讨论题,上面优化完成的代码再让你进行优化,你还可以在哪些方面进行优化呢,或者说上面代码可能会留下哪些坑呢?

三、接口常用优化方式

上述的优化方式可以总结为加索引,业务代码重构两个方式。其中减少循环调用数据库是业务代码重构的内容之一。

数据库层面,加索引需要注意的是索引是否生效,是否选错索引等,如果你对 SQL 优化感兴趣,点个关注,后续更新一篇 SQL 优化的小技巧。

除了加索引,当数据量起来之后,常用的优化方式还有分库分表、数据异构、缓存。

3.1、分库分表

当系统发展到一定程度之后,用户的并发量大,会带来大量的数据库请求,占用大量的数据库连接,同时会带来磁盘IO等方面的问题。

并且随着系统的长时间使用,产生的数据越来越多,造成单表数据量过大,最终造成查询缓慢,即使加了索引查询速度也非常耗时,此时我们就可以使用分库分表的方式进行数据库层的优化。

分库分表大部分同学应该都听过了,这里大概介绍一下。(点个关注,后续深入分析一下分库分表)

分库分表有水平与垂直之分,垂直就是业务方向的拆分,水平就是数据方向。

分库解决的是数据库连接资源不足的问题。

分表解决的是单表数据量过大,SQL 语句即使走了索引查询也非常耗时的问题。

在某些业务场景中,用户并发量大,但是保存的数据量很少时,可以只分库,不分表。

用户并发量不大,但是保存的数据量很多,可以只分表,不分库。

当用户并发量大,数据量也很多时,可以考虑分库分表。

图中将用户库分为3个,在请求到来的时候,可以根据用户ID进行路由到某一个库,然后再定位到某张表。路由规则是可以自己定义的。

3.2、数据异构

数据异构相当于数据进行冗余,在业务接口中,一般返回前端的数据是需要进行多个数据进行封装的。举个例子,用户信息返回,在返回时封装用户的部门信息,角色信息一起返回。

现在我们在封装好上述数据之后,存入 Redis中,只需要读取一次Redis即可。

3.3、缓存

缓存相当于把当前请求的响应结果进行缓存,再次读取时只需要读取缓存,无需复杂的业务逻辑。比如菜单树这种数据。

不管是数据异构还是加缓存,都有可能产生数据不一致问题,而MySQL 与Redis如何保持数据一致可以参考之前写的。

除了上述的数据方面进行优化外,还可以对代码进行业务逻辑的重构,或者说是在代码层面进行优化。常用的方式有异步、避免大事务、减小锁粒度等。

3.4、异步

异步的方式有很多,使用@Async注解,线程池或者MQ都可以实现异步。我们关注的重点是哪些业务可以使用异步处理,在业务逻辑处理中,保留核心业务逻辑,非核心业务逻辑异步处理。

在上面这个接口逻辑中,可以发现除了核心业务外,远程调用,记录日志都可以放入到异步线程中执行,这样就无需主线程等待。不过对于远程调用有的需要返回结果,核心业务需要返回结果支持的另说,这些细节需要好好设计一番了。

3.5、避免大事务

在使用 @Transaction 注解时,需要注意避免在类上使用该注解,在方法上使用该注解时也要注意方法逻辑不要过于复杂。

大事务可能引发问题如下:

  • 死锁。

  • 接口超时。

  • 并发情况下数据库连接池资源耗尽。

  • 回滚时间长。

为了避免大事务的产生,在开发时可以注意以下几点。

  • select 查询方法拿到事务外。

  • 避免在事务中进行远程调用。

  • 事务中避免一次处理太多数据,可以拆分为多个小事务。

  • 个别功能可以异步处理或者非事务运行。

3.6、减小锁粒度

有的场景中,需要进行加锁操作,防止多线程并发修改,造成数据异常。

但是锁要是加的不好,还不如不加,如果锁的粒度太粗,非常影响接口性能。

3.6.1、synchronized

Java 中的关键字加锁,可以写在方法上或者代码块上,举个例子讲一下如何减小锁粒度。


public synchronized saveFile(String filePath) {

mkdir(filePath);

uploadFile(filePath);

saveMessage(filePath);

}

这里加锁是为了防止多次触发创建文件报错,影响业务。

上传文件的操作中,随着文件越来越大,耗费的时间也越长。(此处分片上传不考虑)

这三个过程放入一个方法中,当前锁定的就是这三个操作。

所以我们修改一下代码。


public void saveFile(String filePath) {

synchronized(this) {

if(!exists(filePath)) {

mkdir(filePath);

}

}

uploadFile(filePath);

saveMessage(filePath);

}

修改之后锁定范围仅限于创建文件夹,对于上传文件这种耗时的操作将不再持有锁,提升接口性能。

3.6.2、Redis 分布式锁

使用 Redis 实现分布式锁与 Synchronized 类似,在编写代码时尽量控制锁的范围,锁的粒度越小越好。

Redis 实现分布式锁虽说好用,但是还有8个坑,如果你还不知道可以看下之前写的文章。

3.6.3、数据库锁

MySQL 为例,锁有表锁、行锁之分,这里主要说这两种锁。

  • 表锁:加锁快,锁的粒度最大,发生冲突的概率最高,并发度最低。

  • 行锁:加锁慢,会出现死锁现象,但是锁的粒度小,发生锁冲突的概率低,并发度也是最高的。

所以在数据库锁的优化方向上,优先行锁,其次表锁。

有的同学可能会说还有间隙锁等等,那些本文就不再多说了,大部分场景下使用行锁,尽量不使用表锁即可。

四、总结

在本文中,我们深入探讨了接口性能优化的多种策略,从技术细节到实践应用,讲解了接口优化的9种方式:

1、加索引。

2、禁止嵌套for循环。

3、分库分表。

4、数据异构。

5、缓存。

6、异步。

7、避免大事务。

8、减小锁粒度。

9、优化SQL。

通过这些优化措施,我们可以显著提高接口的响应速度和系统的整体性能,为用户提供更流畅的体验。

最后也欢迎你评论区交流沟通,说说你在接口优化的过程中都用到了哪些优化方式。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末自行领取】

​

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

若依前后端分离版本如何设置接口的超时时间? 找到需要单独设置的接口,添加timeout参数字段,指定超时时间即可。找到需要单独设置的接口,添加timeout参数字段,指定超时时间即可。修改文件位置:src/utils/request.js。 阅读详情

相关推荐

从12摄像头到纯视觉:小鹏AI鹰眼方案如何用LOFIC技术省掉激光雷达?

本文深入解析小鹏汽车AI鹰眼方案如何通过LOFIC技术实现纯视觉自动驾驶,替代传统激光雷达。LOFIC摄像头在动态范围、噪声控制和HDR优化方面表现卓越,结合800万像素双目广角摄像头,达到激光雷达级测距精度。该方案不仅降低成本,还提升系统可靠性和用户体验,展示了纯视觉路线的技术潜力与边界。

t8u9v0w1x的博客 932

Spring Cloud 3.0.X,接口请求响应时间过长的排查记录及优化修改方案

Spring Cloud 3.0.X,接口请求响应时间过长的排查记录及优化修改方案

running17的博客 2730

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 472

接口响应时间常见的优化方法

5. 负载均衡:在高并发情况下,使用负载均衡可以将请求分发到多个服务器上,从而提高接口的响应速度。4. 异步处理:将一些耗时的操作异步执行,比如发送邮件、生成报表等,可以减少接口的响应时间。6. CDN加速:使用CDN可以将静态资源缓存在离用户较近的节点上,从而加快接口的响应速度。3. 代码优化:优化代码结构和算法,避免重复计算和不必要的循环,可以提高接口响应速度。1. 使用缓存:缓存可以减少对数据库或其他资源的访问次数,从而加快接口响应速度。

Seaunity的博客 6186

深入解析6T SRAM的读写机制与性能优化

本文深入解析了6T SRAM的基本结构与核心工作原理,详细阐述了其读写操作的具体时序与机制。文章重点探讨了在先进工艺下面临的读写稳定性、写入能力等性能挑战,并系统介绍了写入辅助与读取辅助等关键优化技术,旨在提升SRAM的可靠性与整体性能。

weixin_29205061的博客 1225

一人公司 CEO × Accio Work:最大能效实战指南

作为一人公司 CEO,你需要同时扮演市场、销售、运营、财务、产品等多个角色。Accio Work 本质上就是你的。

华盛AI的博客 2096

IDEA 插件最佳组合:JRebel+XRebel 热部署和接口分析优化,太爽了!

大家好,我是不才陈某~IDEA上原生是不支持热部署的,当我们修改代码和配置文件等大部分操作时,都需要重启服务器。JRebel是一款JAVA虚拟机插件,它使得JAVA程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。JRebel使你能即时分别看到代码、类和资源的变化,从而跳过了构建和部署的过程,可以省去大量的部署用的时间。目前对于idea热部署最好的解决方案就是安装JReb...

码猿技术专栏 983

SAP中成本估算没有找到工艺路线消息处理实例

在针对成品的标准成本核算处理过程中,系统中会经由设定好的策略来收集成品相关成本组成,最终计算出产成品的标准成本。关于成本组成,可以归纳为三个基本要素,料,工,费。即标准成本就是要知道,生产一件成品,需要消耗多少钱的原材料?消耗多少钱的人工?以及其它的间接消耗? 某日,接到CO同事的反馈,在用CK11N做产成品标准价格核算时,提示没有工艺路线确定,但该消息为绿灯,可以通过。基于业务上的谨慎,提出分析。 从提示可以看出问题与工艺路线有关。因为,成品工艺路线中设定有成品生产所耗工时,所以,在计算产成品标准

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6278

将一个接口响应时间从2s优化到 200ms以内的一个案例

一、背景 在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧… 本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。 二、步骤 2.1 定位 定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。 2.1.1 工具监控 就工具而言,推荐使用 arthas ,用到的是 trace 命令 具体安装步骤很简单,大家自行研究。 我的使用步骤是...

悟鸣的技术博客 4万+

YOLOv11改进 | 损失函数篇 | YOLOv11引入引MPDIoU, GIoU,DIoU, CIoU, SIoU,EIoU, WIoU, LMPDIoU等损失函数

到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~1. YOLOv11中添加MPDIoU, GIoU,DIoU, CIoU, SIoU等损失函数的方式。文件中用给出的代码替换掉。

tsg6698的博客 5277

OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)

上一篇编译了proj6.2.0、gdal3.2.1,本篇继续。 OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译Osg,然后编译OsgEarth。OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

java提高接口响应时间的办法_将一个接口响应时间从2s优化到 200ms以内的一个案例...

一、背景在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧…本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。二、步骤2.1 定位定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。2.1.1 工具监控就工具而言,推荐使用 arthas ,用到的是 trace 命令具体安装步骤很简单,大家自行研究。我的使用步骤是,先最终待研究的函...

weixin_33953395的博客 6263

【Go语言实战】(2) Gin+Vue 电子商城

618来!!不用纠结去哪里剁手了!直接自己安排一个商场不香吗??

面向生活编程 4827

rkt容器性能调优案例:从100ms到10ms的响应时间优化

你还在为容器启动缓慢、响应延迟而烦恼吗?本文将通过真实案例,展示如何将rkt容器的响应时间从100ms优化至10ms,让你的应用体验飞起来。读完本文,你将掌握rkt容器性能调优的核心方法,包括配置优化、资源调整和高级调优技巧,全面提升容器运行效率。 ## 性能瓶颈分析 在开始优化之前,我们首先需要了解rkt容器的性能瓶颈所在。通过[rkt-monitor](https://link.gitcod...

gitblog_00451的博客 1066

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Keystone性能优化案例研究:从100ms到10ms的响应时间优化

你是否也曾面临CMS后台加载缓慢、用户操作卡顿的问题?当管理系统响应时间超过100ms时,不仅影响运营效率,更会降低团队协作体验。本文将通过实际案例,展示如何通过Keystone内置工具和架构优化,将列表查询响应时间从100ms压缩至10ms级别,同时保持代码可维护性。 ## 性能瓶颈诊断 在优化前,我们的内容管理系统存在明显性能问题:文章列表页加载需要80-120ms,在数据量超过1000条...

gitblog_00561的博客 717

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Hunyuan翻译引擎响应时间优化:从500ms到100ms

通过对腾讯开源的 Hunyuan 翻译模型 HY-MT1.5 系列进行系统性性能优化,我们成功将其响应时间从初始的500ms 降低至 100ms 以内,实现了质的飞跃。模型层面:采用 GPTQ 4-bit 量化,在几乎无损翻译质量的前提下大幅降低显存与计算开销;推理引擎:替换为 vLLM 框架,利用 PagedAttention 和连续批处理显著提升吞吐;缓存设计:构建双层缓存体系,有效应对高频短句重复请求;系统调优:探索 CUDA Graph 与 TensorRT-LLM 等底层技术,逼近硬件极限。

weixin_33531560的博客 910

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python 输出文件中返回码为200的接口的平均响应时间_将一个接口响应时间从2s优化到 200ms以内的一个案例...

一、背景在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧…本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。二、步骤2.1 定位定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。2.1.1 工具监控就工具而言,推荐使用 arthas ,用到的是 trace 命令具体安装步骤很简单,大家自行研究。我的使用步骤是,先最终待研究的函...

weixin_39820185的博客 478

记录一次接口优化的过程。接口响应时间从500s下降到5s。

目前5个怀疑点的总耗时由 13秒+100.8秒+29.4秒+16.8秒+193.2秒 =360 秒,优化到3s +33.6秒+

weixin_41945912的博客 1197

后端优化:接口响应从 2s 降到 200ms 的方法

迭代优化:优化后重新测量响应时间,使用公式计算改进比例: $$\text{改进比例} = \frac{T_{\text{前}} - T_{\text{后}}}{T_{\text{前}}} \times 100%$$ 目标是从 2000ms 降到 200ms(90% 提升)。真实案例:通过以上方法,一个电商接口从 2s 优化到 150ms,关键是将数据库查询从 1200ms 降到 100ms(索引 + 缓存),并异步化日志记录。注意事项:优化前备份代码,避免过度优化;

2501_93895791的博客 416

从100ms到10ms:Spring Boot接口性能飞跃的7个核心优化技巧

掌握Java Spring Boot优化技巧,将接口响应从100ms降至10ms。适用于高并发场景,涵盖异步处理、缓存策略、数据库优化等7大核心方法,显著提升系统性能与稳定性,值得收藏。

IterLoom的博客 312

Filestash性能优化案例:从100ms到10ms的突破

你是否曾在使用Filestash管理云存储时遭遇"加载中"的无限等待?当用户同时浏览包含数百个文件的目录时,传统架构下的Filestash会出现**100ms+的响应延迟**,在弱网络环境下甚至飙升至**300ms+**。通过性能剖析发现,这源于三个核心瓶颈: 1. **存储后端往返开销**:每次目录切换需3次以上存储API调用 2. **重复数据传输**:相同文件元数据被重复请求(占总流量的4...

gitblog_00127的博客 680

高并发接口性能优化实战:从200ms到20ms的蜕变之路

本文总结了性能优化的核心策略与实践,从订单接口响应超标的案例出发,提出精准定位性能瓶颈的三大工具(链路追踪、Profiler、火焰图)。详细介绍了十大优化策略,包括批量查询、多级缓存、连接池调优、异步处理等,使接口RT从220ms降至20ms。同时分享了JIT/GC调优、压测验证方法,以及建立长效防御体系的方案。最后强调性能优化应遵循数据驱动、全链路视角等原则,让系统资源得到极致利用。性能优化是持续演进的过程,需要平衡优化效果与系统复杂度。

豆豆的博客 1249
上一篇: 确认:代码覆盖率是无用的管理指标
下一篇: 5大自动化测试的Python框架
程序员可可
博客等级 码龄2年 3536粉丝 428原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值