由Content-Length请求头引发的惨案
1、问题描述
最近生产上频繁收到客户投诉,反馈文件下载响应很慢,而且老是出现等待超时情况,一开始还以为是文件过大或者网络问题导致。经过排查发现问题并非如此简单。
2、问题排查定位
首先是根据文件ID查看了文件大小,发现是一张大小约5MB的JPG图片,按道理这么大点图片不会出现一分钟超时。因为文件都是放阿里云OSS的,于是又去排查了一下网络问题,发现也不是。在困扰之际,突然想起来最近对接第三方更改了文件下载接口部分代码,会不会是代码导致,于是翻看了最近改动的代码逻辑,发现出来加了如下代码,并没有其他改动。
如上图看到只是为了配合上游在请求头加了 “Content-Length”,难道这个会导致客户端无限等待导致超时?怀着疑问去查了相关资料。先看下网上对这个请求头的相关解释。
看了这个解释后突然明朗了,原来在上传文件的时候会对文件做压缩处理,并且讲上传记录入库,记录文件信息(包含了文件大小,压缩前的)。恰巧代码里添加的Content-Length的文件大小就是从数据库读取的压缩前的文件大小,**这就导致了添加的大小跟实际接口拿到的大小不一致,造成浏览器没法判断响应体已经结束,造成一致pending,直到请求超时。**了解了问题原因,下面就好解决了。
3、问题解决
方法一:
直接去掉Content-Length请求头,简单粗暴。
方法二(推荐):
解决文件大小不一致问题,一是在存储入库的时候就取压缩后的文件大小,而不是取压缩之前。二还可以在不动上传情况下,再添加Content-Length直接从文件中取文件长度,而不是从事先存储的文件大小读取。看下修前前后代码。
4、总结反馈
至此问题得到解决,总结下还是基础知识不够扎实,还得继续努力。