題幹與適用情境
執行時、租戶隔離和執行預算已經存在。本題只處理相容與組合:數百個已安裝元件實作不同世代的 WebAssembly Interface Types(WIT),一條工作流程還會串接解析、去識別與匯出元件。請設計相容層,讓平台能調整介面、組合元件並安全淘汰舊版本。
WIT 只定義契約,不定義行為;world 會列出元件的匯入與匯出,Component Model 允許組合元件。這些機制讓相容性可以檢查,但不會替平台決定哪些變更安全、組合圖最後能取得哪些權限。
面試官考察點
- 能否區分原始碼相容、WIT 結構相容和業務語意相容。
- 能否逐項授權組合圖的匯入,避免一個外掛借另一個外掛擴大權限。
- 能否讓轉接器有版本、可觀測、可淘汰,而不是永久隱藏邏輯。
- 能否處理資源所有權與狀態,使回滾真的可執行。
回答前需要釐清的問題
- 哪些已安裝版本必須相容,支援期多長?
- 呼叫傳遞無狀態值、串流,還是 owned/borrowed 資源控制代碼?
- 外掛能直接呼叫外掛,還是必須經過宿主?
- 變更只是新增欄位,還是改變錯誤、預設值或所有權?
- 整條工作流程要原子回滾,還是元件可以分開升級?
無狀態值通常可直接轉接;資源所有權變更往往需要新的主版本與遷移。只有連結階段能證明最終匯入仍在租戶授權內,才適合直接組合。
30 秒回答框架
「我會把每個 WIT package 與 world 依不可變版本登錄,擷取匯入、匯出、型別和資源所有權,再於實例化前檢查組合圖。舊外掛保留舊契約;小型轉接器可以轉換舊值,但不能創造權限,也不能偷偷改變失敗語意。宿主只授予租戶政策與元件聲明權限的交集。發布前用固定樣本比對新舊圖,再按租戶灰度,並保留舊圖直到回滾與淘汰門檻都通過。」
分步驟深入解答
第一步:建立介面登錄庫與相容報告
登錄 WIT 套件版本、world、匯入匯出、型別、資源所有權、產物摘要和轉接路徑。發布時與所有受支援前代比較。新增選用欄位可能可轉接;刪除 variant 分支、改變錯誤含義,或把 borrowed 控制代碼改成 owned 資源,都需要明確遷移。
第二步:把轉接器限制為單向小轉換
轉接器只處理一對已知契約,可以改欄位名稱、填入有文件的預設值或映射錯誤。無法安全表達的資料必須拒絕。盡量只允許一跳轉接;多層鏈路會放大歧義,也讓回滾難以說明。
第三步:對完整組合圖進行能力授權
連結前解析每個匯入的提供者,產生最終能力清單。宿主再依租戶和外掛授權檢查檔案、網路、時鐘、亂數或業務服務介面。去識別外掛不能因為與匯出外掛組合就取得網路權限。高權限呼叫繼續經過宿主介面,以便統一執行政策和稽核。
第四步:用行為證據決定是否淘汰
讓新舊圖執行同一組確定性樣本,比對型別化輸出、錯誤、資源建立與釋放、宿主呼叫和資源預算。安全時再影子處理真實請求,並按租戶灰度。回滾切換到上一份相容圖;若有狀態控制代碼,必須先排空或遷移。
高品質示範回答
「我會把 WIT world 當成可部署契約。登錄庫中的每個不可變項目記錄套件版本、完整匯入匯出、型別結構、資源所有權、產物摘要與受支援前代。只有值的增量變更可用一個經審查的轉接器;所有權變更、缺少 variant 分支或新增副作用,必須發布新契約並遷移呼叫端。
組合由版本化圖描述。連結器解析提供者,宿主另外檢查完整匯入集合。權限上限同時受租戶政策與各元件聲明限制。上線前用固定樣本比對值、錯誤、宿主呼叫和資源生命週期,再按租戶灰度。舊圖保留到不相符率、錯誤率、延遲和資源洩漏都達標。這回答的是介面演進與安全組合,不會重複一般外掛沙箱設計。」
常見錯誤
- 把所有新增項目都視為相容 → 新匯入或預設值也可能改變行為 → 分別檢查型別、權限、所有權與語意。
- 組合時合併全部權限 → 低權限元件借到高權限能力 → 按元件與租戶授權校驗完整圖。
- 無限串接轉接器 → 實際行為依賴不透明鏈路 → 限制跳數,並依使用量淘汰。
- 只比較成功輸出 → 錯誤、宿主呼叫和資源洩漏仍可能退化 → 同時比較副作用與生命週期。
- 有狀態元件直接切回舊版 → 活躍控制代碼可能屬於新契約 → 先排空、遷移或固定工作階段。
追問及應對
新版本要求額外網路權限怎麼辦?
把它視為權限變更,發布新組合圖並讓租戶管理員明確授權。未授權的已安裝實例繼續使用舊契約。
舊值無法表示成新型別怎麼辦?
轉接器回傳型別化的不相容錯誤,受影響樣本或租戶停止灰度。編造預設值會隱藏資料遺失,應使用遷移工具或平行主版本。
如何淘汰轉接器?
依版本記錄安裝呼叫端、真實呼叫量、不相符率和最後使用時間。先停止新安裝,再遷移存量並保留回滾窗口;確認沒有受支援組合圖引用後才刪除。
元件能繞過宿主直接互相呼叫嗎?
匯入與資源語意明確時可以靜態組合,但檔案、網路等特權能力仍由宿主介面提供。授權、配額與稽核才能落在平台可控制的邊界。