接口响应慢不知如何排查?Skywalking来帮你

背景

项目中有一个提交接口,在后端逻辑中,需要先调用查询第三方接口列表AList的接口,根据返回结果循环中掉调用单条更新AUpdate的接口,之后再根据当前循环的数据,去查询第三方查询列表BList接口,再根据返回结果中,调用单条更新BUpdate接口

为啥不做成batch?因为第三方不支持batch更新,同时查询BList接口的查询条件,也不支持传入多个条件,所以只能在AList返回结果的循环中去查询

接口写好了之后,发现提交之后居然需要25s+的时间才能返回处理结果 what?这是啥效率?也太慢了吧

思路

思考之后,认为问题有二:

  • AList返回结果的循环中去一个个调用AUpdate接口,假如AList size=10,则需要调用10次,一次1s,那也是10s了
  • BList返回结果中,又一个个去调用BUpdate接口,那如果BList size=10,1次1s,那累计时间就是10 x 10 x 1 = 100s,那速度肯定慢呀

因为需求不接受异步查询执行结果,那既然一次次这么慢,就改为多线程吧,按照上例,累计时间充其量最多也就是 2s + 2s = 4s吧

按照这个思路改了代码之后测试,发现相应速度确实快了,但也还是处于不可接受的范围内,平均10s

这就头大了,咋办?测试让优化速度,说代码有问题,这不得拿点真凭实据出来看看证明一下? 此时想到可以搞一下链路追踪,看下累计时间和每个调用花的时间,不就对了,于是想到之前项目中用到过的Skywalking

Skywalking安装

  1. 下载地址,版本随意,我这里选择的9.7.0

  2. 解压之后,运行其中的bin目录中的startup.bat或者startup.sh

  3. 在对应的java springboot项目jvm参数中加入如下参数

ini 复制代码
-javaagent:/your_skywalking_install_path/apache-skywalking-apm-bin/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=your_server_name
-Dskywalking.collector.backend_service=127.0.0.1:11800
  1. 启动你的java springboot服务
  2. 访问你自己服务的接口
  3. 访问http://localhost:8080/trace
  4. 在trace中,就可以看到你自己接口的调用以及耗时了 对应左侧,就是每个请求信息,右侧,则是对应链路耗时信息

结论

以我这个请求为例,开始以为是AList和BList返回的结果过多导致,可尝试两个返回结果都只1条为例,总计耗时依然到了6998ms,通过上图的链路追踪信息发现,耗时最多的操作基本都在http调用上,AUpdate耗时2999ms,BList耗时401ms,BUpdate耗时2879ms,这里就花了6280ms,而这两个操作,业务逻辑并不允许并行执行,必须要前者成功之后才能执行后者

这下报告甩到测试脸上,终于没话说了,只能产品自己去改需求了,要么就只有自己默默接受这么长的耗时

相关推荐
Adellle14 分钟前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
特立独行的猫A1 小时前
cj-tauri:用仓颉写桌面与鸿蒙 PC 应用
java·后端·python
Lonely丶墨轩1 小时前
从一个 404 到负数 ID:第三方接口开发中的几次排错
java
聪明的笨猪猪1 小时前
实际工程问题:AI生成MyBatis批量操作的SQL超限与性能雪崩
java·经验分享·面试·ai编程
文丑颜不良啊1 小时前
LeetCode2501~2520题目解析
java·leetcode
mldong1 小时前
同一个节点,同一个人,办两次:jeeflow 的已办撤回
后端·架构
瑞雪兆丰年兮1 小时前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web
唐老板1 小时前
Spring Boot 4 默认开虚拟线程,HikariCP 却成瓶颈
java
深蓝AI2 小时前
45 万星的开源逆向 MCP:REA 让 Agent 无源码读懂任意应用,把证据和边界写进设计
人工智能·程序员