天天看點

使用cdn加速oss,通路cdn域名的視訊URL特别慢

現象 使用cdn加速oss,視訊存放在oss上,cdn域名開啟了range回源,通路視訊url打開特别慢

原因 視訊meta資訊在視訊尾部,浏覽器通常會發先發range(0-)請求在頭部看不到meta資訊,會中斷請求再發個range請求擷取視訊尾部的位元組資訊,由于cdn域名開啟了range回源,cdn會認為第一次range請求包含第二個,會把兩個請求合并等第一range請求響應完畢才會處理第二個,這樣擷取視訊尾部位元組的range請求就會堵塞在那等第一個range請求導緻打開響應時間非常長

分析

1 通路視訊url時,首先cdn會響應200如下圖

使用cdn加速oss,通路cdn域名的視訊URL特别慢

浏覽器要播放視訊,需要知道meta資訊才會播放,是以浏覽器會首先發個range請求去擷取meta資訊,range範圍是“0-“,如下圖

使用cdn加速oss,通路cdn域名的視訊URL特别慢

2 浏覽器在擷取部分位元組後發現視訊頭部沒有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特别慢

4 擷取到視訊meta資訊才開始播放,可以看到播放range是48-408404477,meta資訊一般都是48位元組

使用cdn加速oss,通路cdn域名的視訊URL特别慢

解決方案

1 關閉range回源,這樣每次range請求都直接透傳給oss,oss不會合并range請求會直接響應,不過這樣會影響range回源效率,建議方案2

2 使用媒體轉碼服務把視訊轉碼,轉碼成标準視訊格式,meta資訊在視訊頭部就好了