出现状态码 504 ,可能有哪些问题?
-
网络异常
- 网络丢包
- 带宽被占满
-
死锁,比如你提供的API接口中根据id更新某条数据时,正好线上在手动执行一个批量更新数据的sql语句,该sql语句在一个事务中,并且刚好也在更新那条sql语句,可能会出现死锁的情况。由于该sql语句执行时间很长,会导致API接口的那次更新数据操作,长时间被数据库锁住,没法即使返回数据,而出现接口超时问题。
-
慢查询 sql,看看有没有慢sql,或者有时候会走错索引甚至不走索引,可以使用
force index
,强制走哪条索引 -
接口发生死循环
- 普通死循环
while(true)
在CAS自旋锁中常见 - 无限递归
- 普通死循环
-
线程池溢出,我们调用的API接口,有时候为了性能考虑,可能会使用线程池异步查询数据,最后把查询结果进行汇总,然后返回。
调用远程接口总耗时 200ms = 200ms(即耗时最长的那次远程接口调用)但如果用户请求太多,线程池中已有的线程处理不过来,线程池会把多余的请求,放到队列中排队,等待空闲线程的去处理。如果队列中排队的任务非常多,某次API请求一直在等待,没办法得到及时处理,就会出现接口超时问题。考虑是否核心线程数过小或者多种业务共用了线程池 -
接口超时时间设置过短,合理设置连接超时时间和读超时时间,业务并发量大的时候设置超时时间短一点,设置成秒级或者毫秒级,业务并发量小的时候设置稍长一点,连接超时时间设置为10s,读超时时间设置为20s
-
一次性返回的数据过多,比如调用第三方API更新数据库的时候,一次性批量更新太多太多的数据,更新时间还相同
-
传入参数过多,比如说根据id集合批量查询分类接口,传入了几千甚至几万的id
-
服务OOM 了
-
在 debug
参考资料:
面试又跪了,504 错误码是什么问题?