调用接口pending的解决方案
这个问题是在项目试运行一周左右出现的,最初是以为服务器承受不了压力崩溃了。后来发现调用某个查询接口之后pending,再之后调用任何一个接口全部都pending阻塞了。
定位问题
定位这个API接口后,我在代码里加入了打印接口每一步调用时间,云上打印出日志。惊讶的发现这个接口调用之后,有一个开始时间,但是再也没能打印出结束时间。同时我还看了下Linux服务器CPU使用率,当时没截图,印象里大概CPU直接飙慢了。
原因
既然定位了这个API查询接口有问题,那就简单多了。explain下SQL语句,果然写这个语句的同伴在里面浑水摸鱼,没好好构造,复杂度太高了,接口直接扎进去出不来了。
解决方案
1.当时项目正在试运行,最简单的方案就是直接数据库配置下my.cnf,设置sql语句最大查询时间,超过了就给他报错。
2.后期就给所有的前端代码里,路由切换时取消pending,不要因为一个接口拖累所有的。
3.最重要的还是写代码是就优化好速度,或者增加些筛选条件。
结语
当时所有接口都是测试过的,不过测试库没有没有那么多测试记录去测试性能,而且确实设计数据库是搞了太多联表查询,这也怪我们这个学生项目组太年轻了。代码复杂度高,运行效率低也是外行人写代码的通病。所以写代码一定要注意复杂度,多多优化代码的执行速度和效率。