使用cdn加速oss,访问cdn域名的视频URL特别慢

现象 使用cdn加速oss,视频存放在oss上,cdn域名开启了range回源,访问视频url打开特别慢


原因 视频meta信息在视频尾部,浏览器通常会发先发range(0-)请求在头部看不到meta信息,会中断请求再发个range请求获取视频尾部的字节信息,由于cdn域名开启了range回源,cdn会认为第一次range请求包含第二个,会把两个请求合并等第一range请求响应完毕才会处理第二个,这样获取视频尾部字节的range请求就会堵塞在那等第一个range请求导致打开响应时间非常长


分析


访问视频url时,首先cdn会响应200如下图

使用cdn加速oss,访问cdn域名的视频URL特别慢


浏览器要播放视频,需要知道meta信息才会播放,所以浏览器会首先发个range请求去获取meta信息,range范围是“0-“,如下图

使用cdn加速oss,访问cdn域名的视频URL特别慢


浏览器在获取部分字节后发现视频头部没有meta信息,这时候会中断请求,从下图可以看到获取了51KB左右中断了,重新发个range获取视频尾部一段字节来得到meta信息

使用cdn加速oss,访问cdn域名的视频URL特别慢

由于cdn开通了range回源,cdn会合并回源请求,步骤1的请求已经包含这些range字节,所以cdn会等步骤1响应完后才会处理步骤2的range尾部内容请求,可以发现这个range请求处理30多s还是没有响应,浏览器又多次发range请求获取文件尾部信息,如下图获取多次都没有响应,都在等步骤1cdn回源oss的响应

使用cdn加速oss,访问cdn域名的视频URL特别慢


3 步骤1响应完毕后,获取尾部的range请求才会响应,如下这个截图,响应成功,可以看到浏览器获取1M左右内容

使用cdn加速oss,访问cdn域名的视频URL特别慢使用cdn加速oss,访问cdn域名的视频URL特别慢


如下截图可以看到浏览器在播放视频之前获取meta信息的两个请求,先读头部信息拉取51KB左右发现没有meta信息中断请求,再发range请求获取尾部信息,中间发起多个range请求都没有响应,最后响应可以看到拉取了1M左右大小获取到meta信息


使用cdn加速oss,访问cdn域名的视频URL特别慢

获取到视频meta信息才开始播放,可以看到播放range48-408404477meta信息一般都是48字节

使用cdn加速oss,访问cdn域名的视频URL特别慢


解决方案

1 关闭range回源,这样每次range请求都直接透传给oss,oss不会合并range请求会直接响应,不过这样会影响range回源效率,建议方案2


2 使用媒体转码服务把视频转码,转码成标准视频格式,meta信息在视频头部就好了



上一篇:graphql学习(六)


下一篇:golang的switch语句使用fallthrough