重試是錯誤恢復的第一手段。重試策略的選擇取決於兩個因素:失敗是否可能自行恢復(暫時性網路中斷 vs 伺服器不存在),以及使用者是否願意等待(前景操作 vs 背景同步)。

自動重試 vs 手動重試

自動重試

系統在失敗後自動重新嘗試,使用者不需要手動操作。適合背景操作(資料同步、事件上報、心跳檢查)和暫時性失敗(網路閃斷、server 短暫過載)。

自動重試的 UX 要求:使用者需要知道系統正在重試。「連線中斷,正在重新連線(第 2 次嘗試)」比靜默重試更透明。如果使用者不知道系統在重試,靜默的等待會被解讀為「系統卡住了」。

自動重試必須有上限。無限重試在不可恢復的失敗場景中(伺服器已關閉、認證已過期)浪費資源和電量,且使用者無法察覺問題。

手動重試

使用者點擊「重試」按鈕觸發重新嘗試。適合前景操作(使用者主動發起的連線、提交、搜尋)和需要使用者確認意圖的場景。

手動重試的 UX 要求:重試按鈕在 error 畫面上明顯可見,旁邊有退出路徑(返回按鈕)。使用者可以選擇重試或放棄。

混合策略

先自動重試 N 次,失敗後切換到手動重試。這是連線類操作的常見模式 — WebSocket 斷線後自動重連 3 次,3 次都失敗後顯示「連線失敗」+ 手動重連按鈕。

重試間隔策略

立即重試

失敗後立即重新嘗試,中間沒有等待。適合極短暫的瞬態失敗(DNS 解析偶發失敗、TCP 連線被 reset)。

立即重試的風險是在 server 過載時加劇問題 — 多個 client 同時立即重試產生 thundering herd 效應。

固定間隔重試

每次重試間隔固定時間(例如每 5 秒重試一次)。簡單可預測,使用者能估算等待時間。

指數退避(exponential backoff)

每次重試的間隔加倍。第一次 1 秒、第二次 2 秒、第三次 4 秒、第四次 8 秒。加上隨機抖動(jitter)避免多個 client 同步重試。

指數退避適合 server 端過載或暫時不可用的場景。間隔越來越長給 server 恢復的時間,同時減少 client 的資源消耗。

指數退避的 UX 挑戰是使用者感知到的等待越來越長。第四次重試等 8 秒時使用者可能已經失去耐心。解法是顯示倒數計時(「12 秒後自動重試」)和手動重試按鈕(使用者可以跳過等待立即重試)。

重試狀態的 UI 呈現

使用者需要知道三件事:系統正在重試、已經重試了幾次、下一次重試在什麼時候。

1連線失敗,正在重新連線...
2第 2 次嘗試(共 5 次上限)
3下次重試:8 秒後 [立即重試] [返回首頁]

重試達到上限後,UI 從「重試中」切換到「失敗」狀態,顯示手動重試和退出路徑。

下一步路由