這個系列將介紹一些在工作中遇到的奇形怪狀(?)的問題,這些問題更偏向於情境本身,而非程式語言的漏洞。我們將採用問答的方式,讓大家能夠一起思考。那麼,第一集我們就來探討:傳輸中斷。
問題描述
原本後台有一個下載/觀看影片的功能,這個功能行之有年,幾乎從未出錯。然而,近期卻有許多客戶反映,下載常常在一半的時候就失敗了。已知情況
- 並不是所有影片都會失敗。
- 解析度越高的影片越容易下載失敗。
- 下載不一定一開始就失敗,通常是在進度條運行一段時間後,頁面突然當機導致失敗。
- 所有格式的影片檔都有可能發生下載失敗。
- 查看近一個月的 log 檔(更久之前的紀錄已被刪除),發現下載檔案的 API 用量在三週前明顯增加,而在兩週前開始頻繁出現錯誤。
- 調整 API 的連線時間後,情況似乎有稍微好轉。
=================思考分隔線=================
解決方式
深入調查後,發現問題是由於檔案大小過大,導致接收回傳時出現中斷。這種情況在影片或高畫質圖片的檔案傳輸中尤為常見。其原因可能有多種,例如伺服器端的連線時長問題或使用者端的網路連線不穩等,都可能導致這一現象。
解決方法其實很簡單,只需將要傳送的檔案利用 byte-range 的方式進行分段傳輸即可。這部分可以參考 RFC 9110: HTTP Semantics。
另外需要特別注意的是,由於某些瀏覽器或 proxy 會檢查 header 的長度以避免不正常傳輸,因此這部分需要額外進行調整喔!
參考資料
- https://www.rfc-editor.org/rfc/rfc9110.html#name-byte-ranges
- https://github.com/mozilla/pdf.js/issues/9022
- https://cloud.google.com/storage/docs/samples/storage-download-byte-range#storage_download_byte_range-php