更新於 2024/12/08閱讀時間約 3 分鐘

疑難雜症系列 - 1: 傳輸中斷

這個系列將介紹一些在工作中遇到的奇形怪狀(?)的問題,這些問題更偏向於情境本身,而非程式語言的漏洞。我們將採用問答的方式,讓大家能夠一起思考。那麼,第一集我們就來探討:傳輸中斷

問題描述

原本後台有一個下載/觀看影片的功能,這個功能行之有年,幾乎從未出錯。然而,近期卻有許多客戶反映,下載常常在一半的時候就失敗了。

已知情況

  1. 並不是所有影片都會失敗。
  2. 解析度越高的影片越容易下載失敗。
  3. 下載不一定一開始就失敗,通常是在進度條運行一段時間後,頁面突然當機導致失敗。
  4. 所有格式的影片檔都有可能發生下載失敗。
  5. 查看近一個月的 log 檔(更久之前的紀錄已被刪除),發現下載檔案的 API 用量在三週前明顯增加,而在兩週前開始頻繁出現錯誤。
  6. 調整 API 的連線時間後,情況似乎有稍微好轉。


=================思考分隔線=================


解決方式

深入調查後,發現問題是由於檔案大小過大,導致接收回傳時出現中斷。這種情況在影片或高畫質圖片的檔案傳輸中尤為常見。其原因可能有多種,例如伺服器端的連線時長問題或使用者端的網路連線不穩等,都可能導致這一現象。

解決方法其實很簡單,只需將要傳送的檔案利用 byte-range 的方式進行分段傳輸即可。這部分可以參考 RFC 9110: HTTP Semantics

另外需要特別注意的是,由於某些瀏覽器或 proxy 會檢查 header 的長度以避免不正常傳輸,因此這部分需要額外進行調整喔!

參考資料

  1. https://www.rfc-editor.org/rfc/rfc9110.html#name-byte-ranges
  2. https://github.com/mozilla/pdf.js/issues/9022
  3. https://cloud.google.com/storage/docs/samples/storage-download-byte-range#storage_download_byte_range-php
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.