1.记一次接口优化
背景介绍
我们部门有个核心业务是资讯相关业务
资讯分为三个流程每个流程包含若干功能点
- 撰写(新增,保存,提审,删除)
- 审核(退回,保存,发布,发布并推送)
- 发布(退回,保存,更新,再发布)
三个流程提供十多个功能点,每个功能点还包含有其他的流程,比如有些流程涉及调用外部AI接口进行关键词计算,同步到MQ进行消息推送,以及附件处理,文章关系处理等等.
恐怖的事情发生了
这么多功能点和流程竟然浓缩到了一个接口里面!!!
这就搞的整个流程代码大概一千五百多行,流程之间非常不清晰,大家也都只敢往里面加代码,不敢去除代码...久而久之这个接口流程就变得非常非常慢了,平均请求时间甚至达到了5秒,遇到特殊时候甚至会达到20秒
解决
发生了20多秒的请求后老板就忍无可忍了,发话让改了
直接说一下解决方案吧
- 1.尽量减少sql查询次数
- 2.优化数据结构 ---------某些可能用两次for循环遍历操作的,可以改变下数据结构,比如查了资讯列表和作者列表,赋值资讯里的作者名,可以变换为map(资讯id,资讯dto)形式
eg:res是List<SecuritiesInfoSearchRespVo>,变成已uniqueCode为key其实体为value的map
res.stream().collect(Collectors.toMap(SecuritiesInfoSearchRespVo::getUniqueCode, Function.identity()));
- 3.异步处理耗时操作-----部分时效不要求那么高,操作耗时又严重的可以提到异步任务里,比如我们这里的计算关键词要求传入正文给AI,然后AI返回相关的关键词,整个流程要1~2秒,这样的其实提到异步里就非常好,我们这里采用的是协程,用的就非常舒服
网友评论