Logo

第 2 章 上傳路徑:分割、並發與復原(重點)

在上傳方面,目標是在網路波動的情況下盡可能接近“頻寬飽和”,同時將故障成本限制在最低限度(僅重傳失敗的區塊)。 這兩個目標在很大程度上解釋了為什麼上傳感覺更快。

2.1 分塊

  • 客戶端必須將檔案分割成多個區塊; chunk 是上傳/重試的最小單位。
  • 區塊應該使用固定大小(或按檔案大小策略)來簡化並發調度和狀態表示。
  • 直接好處:任何故障僅影響一個區塊,而不是整個檔案。

2.2 並行上傳

並發的目的不是“更多線程”,而是為了避免實際網路中單一連接的三個實際限制:

  • 緩慢啟動和視窗增長: 單一連接增長緩慢,尤其是在跨區域 RTT 較高的情況下。
  • 鏈路抖動: 一個連接上的抖動會降低整體速度;並發使效果變得平滑。
  • 每流整形: 一些網路限制單一流量;多個流可以更接近頻寬上限(在合規性限制內)。
  • 客戶端應該使用有限的並發性(例如 4-12),並在較弱的設備上降低並發性以避免記憶體峰值。
  • 客戶端可以調整並發:當吞吐量增加時增加;當錯誤率上升時下降。

2.3 冪等性和重試

  • 同一塊的重複上傳必須是冪等的:重複提交不得破壞已完成的狀態。
  • 伺服器應該使用(transferId,fileId,chunkIndex)或等效約束來強制唯一性。
  • 客戶端必須實現指數退避重試;失敗應該只重試失敗的區塊。

2.4 斷點續傳

  • 伺服器必須能夠回答“哪些區塊已經上傳”,以便客戶端可以跳過已完成的區塊。
  • 上傳的集應該表示為點陣圖/範圍集,以避免狀態大小隨區塊計數線性增長。
  • 速度優勢:網路中斷、瀏覽器崩潰或網路切換後,復原不會從0%重新開始。

2.5「上傳時分享」(可選)

  • 系統可以在上傳仍在進行時產生可用的傳輸標識符並共享鏈接,以加速交付工作流程。
  • 如果在上傳完成之前允許共享,則必須明確收件者所看到的內容:不完整的內容尚無法下載,或僅顯示進度。