具代表性的面試主題

後端面試:設計 HTTP API 的棄用與日落計畫

後端困難
Offer.cc 編輯團隊發佈 更新

題幹

一個公開 API 有 1 萬個用戶端應用,回應結構必須變更。請設計棄用與日落計畫,涵蓋相容性、回應標頭、發現、遷移證據、執行和回滾。

題目與適用場景

提供者希望在遷移窗口後移除 /v1/items,但用戶端屬於不同團隊,其中一些長期不活躍。假設提供者能按用戶端身分觀察請求,並可並行執行 /v2/items。方案必須區分棄用通知和移除日期,保留安全回退,不能假設只靠回應標頭就能遷移用戶端。

面試官考察點

  • 區分協定提示、文件、用戶端清單和執行措施。
  • 設計增量相容與可度量的遷移門檻。
  • 處理未知用戶端、長期整合和緊急回滾。
  • 選擇狀態碼和回應標頭,不超出標準定義自行發明語意。

回答前需要釐清的問題

確認用戶端是否傳送穩定身分、/v2 是否能增量相容、最短支援期、合約通知要求,以及移除前是否能只讀。若缺少身分,遷移證據應來自憑證、網路中繼資料或明確註冊,而不是猜測 User-Agent。

30 秒回答框架

我會盤點呼叫方,發布版本化遷移指南,增量上線 /v2,並按用戶端測量流量和錯誤對等性。給 /v1 回應加標準 Deprecation 訊號和 Sunset 日期,同時提供儀表板並通知已知負責人。保持舊路徑到明確窗口結束,滿足證據門檻後才執行,返回有文件的終止回應和遷移連結。用功能開關和可逆路由支援關鍵用戶端出問題時回滾。

分步深入解答

1. 建立相容性和證據

定義欄位差異、預設行為、分頁、錯誤和驗證變化。對兩個版本執行契約測試並比較代表性回應。指標按用戶端、版本、端點、狀態和遷移階段標記;不能只看彙總流量,因為低流量用戶端可能很關鍵。

2. 精確表達棄用訊號

Deprecation 回應標頭表示資源已棄用;Sunset 回應標頭表示計畫停止提供的日期。它們只是訊號,不能保證每個用戶端都會理解。文件和負責人通知中重複日期,並在回應體或 API 協定定義的 Link 關係中提供穩定遷移引用。

3. 分階段遷移與執行

先發出警告並建立儀表板,再要求未達目標的用戶端申請明確例外。提供影子比較或選擇加入的流量後再切換預設版本。執行門檻到達後,只拒絕可以安全退役的舊操作,返回機器可讀錯誤並保留支援路徑。風險不同的場景可讓只讀相容期長於寫入相容期。

4. 讓回滾和治理可執行

在變更記錄中保存日落日期、負責人、例外原因和審批。監控遷移後的錯誤差異和未知用戶端請求。舊路徑透過功能開關路由,回滾只需改設定而非重新部署。移除後保留足夠長的遙測和墓碑回應,解釋失敗但不洩露密鑰。

高品質示範回答

我會先盤點 1 萬個呼叫方,明確 /v1/v2 的協定差異。兩個版本並行運行,按用戶端收集指標並執行契約測試。/v1 回應攜帶 Deprecation 和 Sunset 訊號,文件與負責人通知重複日期和步驟。提供者經過警告、選擇加入、預設 v2、執行四階段,並支援明確例外和機器可讀終止錯誤。功能開關保證可回滾,日落門檻依據用戶端證據,而不是彙總流量百分比。

常見錯誤

  • 認為回應標頭會自動遷移 → 許多用戶端會忽略 → 結合標準訊號、負責人發現和遷移指南。
  • 沒有清單就設定日期 → 休眠但關鍵的用戶端會突然失敗 → 要求用戶端身分和例外審查。
  • 只比較總錯誤率 → 單一租戶故障會淹沒在平均值裡 → 監控每用戶端對等性和流量。
  • /v2 上線後立即刪除 → 用戶端沒有相容證據 → 先並行或選擇加入。
  • 回滾必須重新部署 → 故障時恢復緩慢 → 用可逆開關路由版本。
  • 日落時返回無文件的 404 → 自動化無法區分退役和拼寫錯誤 → 發布穩定終止錯誤和遷移引用。

追問及應對

用戶端從不傳送身分標頭,遷移門檻是什麼?

使用提供者已有的憑證、帳戶、網路或註冊身分。沒有可靠身分時延長舊端點支援期,並在執行前要求明確註冊。

Sunset 日期可以調整嗎?

可以,但必須同步更新變更記錄、文件、回應標頭和負責人通知。把日期當作治理承諾,並持續提醒仍依賴舊路徑的用戶端。

/v2 正確但某個用戶端更慢,怎麼辦?

單獨比較該用戶端的延遲和錯誤預算,再優化或授予有時限例外。沒有證據證明是系統性問題時,不要延長所有用戶端的日落窗口。

如何安全退役寫入端點?

證據門檻通過後停止新寫入,盡可能保留讀取,並讓重試返回確定性終止錯誤。移除前確認下游佇列和稽核記錄不再依賴舊寫入。

公開來源

同類題目