通用面試:HTTP 423 Locked 如何設計可恢復的資源鎖?
題幹與適用場景
一個支援 WebDAV 的協作檔案服務允許客戶端編輯同一資源。寫入、移動或刪除時偶爾回傳 423 Locked。請說明 423 與 409、403 的邊界,如何取得和提交鎖定權杖,如何處理深度鎖、逾時、續租和持有者崩潰,並設計可觀測的恢復路徑。
面試官考察點
- 能否把 423 解釋為目標資源目前被鎖,不能泛化成所有並行衝突。
- 是否理解 Lock-Token、If、Timeout 和 UNLOCK 的組合語義。
- 能否設計租約、斷線恢復和權限校驗,避免永久鎖或誤釋放他人鎖。
- 是否會讓客戶端區分可等待、需重新取得鎖和不可重試的失敗。
回答前需要澄清的問題
- 鎖是 WebDAV 寫鎖,還是業務層編輯租約,是否兩者都存在?
- 鎖涵蓋單一資源還是深度為 infinity 的集合,子資源如何繼承和排除?
- 鎖定權杖存在哪裡,是否與租戶、主體、資源版本和權限綁定?
- 客戶端斷線、程序崩潰和時鐘漂移時,誰負責續租與回收?
- 代理是否會重試寫請求,客戶端是否能安全重放?
30 秒回答框架
423 表示請求目標被目前的鎖阻止,重點是資源鎖定狀態,不是通用的權限拒絕或所有版本衝突。我會先確認鎖的範圍、持有者和剩餘租期,再要求客戶端在 If 條件中提交對應 Lock-Token。鎖採用伺服器租約和單調時間,續租必須鑑權,過期由伺服器回收;持有者崩潰後等待租約自然結束。客戶端把 423 視為受控等待或重新取得鎖的訊號,不對非冪等寫操作盲目重試。
分步驟深入解答
第一步:劃清 423 的協定邊界
RFC 4918 將 423 用於請求方法無法套用到被鎖定的資源。403 關注權限,409 關注目前狀態與請求衝突;因此應先判斷阻斷來自鎖、授權還是業務版本條件。
第二步:定義鎖的身分與範圍
鎖記錄至少包含資源識別、鎖根、深度、所有者、權杖、建立時間、租期、權限域和資源版本。深度鎖可能涵蓋子資源,伺服器必須在寫入前解析繼承關係,不能只檢查 URL 自身。
第三步:校驗 Lock-Token
客戶端透過 LOCK 取得權杖,後續寫入、移動或刪除請求在 If 條件中攜帶該權杖。伺服器比較權杖、資源範圍、主體和租戶;權杖缺失、格式錯誤或屬於其他鎖時回傳可診斷的失敗,但不洩露其他租戶的持有者資訊。
第四步:用租約處理逾時與續租
Timeout 是期望值,不應讓客戶端單方面決定永久有效期。伺服器以單調時鐘保存到期時間,續租前再次鑑權並限制最大租期;回應返回實際授予的逾時,客戶端按實際值安排續租。到期後鎖自動失效,避免崩潰造成永久阻塞。
第五步:處理斷線與恢復
持有者重連時先查詢鎖狀態,再用仍有效的權杖續租;不能僅憑本地快取宣稱自己仍持有鎖。伺服器重啟要從持久化儲存恢復租約,若無法證明安全恢復,應讓鎖失效並要求客戶端重新取得,防止舊權杖誤寫。
第六步:區分等待和重試
客戶端可以顯示持有者不可見的「資源正在編輯」狀態,按退避查詢剩餘租期。423 不是網路瞬態錯誤;寫請求只有在確認權杖、版本和請求本文可重放時才重試。代理層不得對未知執行結果的非冪等請求自動重放。
第七步:觀測與安全控制
記錄資源雜湊、鎖範圍、租約剩餘時間、失敗原因、主體雜湊和請求 ID;按租戶、資源類型和客戶端版本統計 423 率、平均持鎖時間、續租失敗和逾期回收。限制深度鎖數量、最大租期和權杖嘗試次數,防止鎖耗盡與權杖猜測。
高品質示範回答
我會先確認 423 真的是 WebDAV 鎖阻斷,並區分 403 權限拒絕和 409 業務狀態衝突。鎖服務持久化資源、深度、主體、租戶、Lock-Token、實際租期和版本。客戶端用 LOCK 取得權杖,在 If 條件中提交;伺服器同時校驗權杖、範圍、主體和權限。租約使用伺服器單調時鐘,續租受最大租期限制,斷線後只能用仍有效的權杖重新確認,崩潰則等待到期自動回收。客戶端把 423 顯示為可恢復的編輯佔用,按剩餘租期退避查詢,不對未知執行結果的寫操作盲目重試。生產監控 423 率、持鎖時長、續租失敗、逾期回收和深度鎖數量,並用多客戶端競爭、重啟、時鐘漂移和代理重試測試恢復路徑。
常見錯誤
- 把所有並行衝突都回傳 423,掩蓋版本條件或權限問題。
- 只在記憶體保存鎖,程序崩潰後留下永久鎖或錯誤釋放他人鎖。
- 接受客戶端要求的無限 Timeout,未返回伺服器實際租期。
- 只比較權杖字串,不校驗資源範圍、租戶和主體權限。
- 讓代理自動重放帶副作用的寫請求,造成重複修改。
追問及應對
423 與 409 何時分別使用?
資源因有效鎖而拒絕方法時使用 423;沒有鎖但請求與目前版本或狀態衝突時使用 409。兩者都需要可診斷的恢復建議,不能互相取代。
深度為 infinity 的鎖如何避免誤傷?
限制深度鎖的權限和數量,解析鎖根到目標資源的繼承鏈,並在移動、複製和刪除時重新計算涵蓋範圍。跨租戶或跨集合操作要明確拒絕,不能預設繼承。
持有者崩潰後能立即強制解鎖嗎?
只有具備明確管理員權限和審計理由時才允許強制解鎖。普通客戶端等待租約到期;強制操作要使舊權杖失效並記錄操作者、原因和資源版本。
伺服器時鐘不一致怎麼辦?
租約過期判斷使用單節點或共識儲存中的單調時間,客戶端只依據回應中的實際剩餘時間。跨節點續租要有版本條件,避免兩個節點同時延長同一把鎖。