由Content-Length请求头引发的惨案

由Content-Length请求头引发的惨案

1、问题描述

​最近生产上频繁收到客户投诉,反馈文件下载响应很慢,而且老是出现等待超时情况,一开始还以为是文件过大或者网络问题导致。经过排查发现问题并非如此简单。
在这里插入图片描述
在这里插入图片描述

2、问题排查定位

​ 首先是根据文件ID查看了文件大小,发现是一张大小约5MB的JPG图片,按道理这么大点图片不会出现一分钟超时。因为文件都是放阿里云OSS的,于是又去排查了一下网络问题,发现也不是。在困扰之际,突然想起来最近对接第三方更改了文件下载接口部分代码,会不会是代码导致,于是翻看了最近改动的代码逻辑,发现出来加了如下代码,并没有其他改动。
在这里插入图片描述
如上图看到只是为了配合上游在请求头加了 “Content-Length”,难道这个会导致客户端无限等待导致超时?怀着疑问去查了相关资料。先看下网上对这个请求头的相关解释。
在这里插入图片描述
看了这个解释后突然明朗了,原来在上传文件的时候会对文件做压缩处理,并且讲上传记录入库,记录文件信息(包含了文件大小,压缩前的)。恰巧代码里添加的Content-Length的文件大小就是从数据库读取的压缩前的文件大小,**这就导致了添加的大小跟实际接口拿到的大小不一致,造成浏览器没法判断响应体已经结束,造成一致pending,直到请求超时。**了解了问题原因,下面就好解决了。

3、问题解决

方法一:

直接去掉Content-Length请求头,简单粗暴。

方法二(推荐):

解决文件大小不一致问题,一是在存储入库的时候就取压缩后的文件大小,而不是取压缩之前。二还可以在不动上传情况下,再添加Content-Length直接从文件中取文件长度,而不是从事先存储的文件大小读取。看下修前前后代码。
在这里插入图片描述

4、总结反馈

至此问题得到解决,总结下还是基础知识不够扎实,还得继续努力。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值