題幹與適用情境
這次遷移同時改變欄位名稱與業務語意:total_cents 預設美元,amount_minor 則必須搭配明確幣種使用。Avro alias 可協助名稱解析,卻不能證明舊的「美分」已正確轉成「貨幣最小單位」。
面試官考察重點
- 是否先擴充 reader,再讓 producer 寫新欄。
- 是否分開處理結構相容與金額語意。
- 是否為 90 天重播保留舊 Schema 和轉換規則。
- 是否用消費證據決定退役。
回答前需要釐清的問題
確認格式、Registry 相容模式、未知欄位處理、金額單位、幣種欄位、最慢消費者與重播週期。若語意無法雙向表達,還要確認能否建立 v2 topic。
30 秒回答架構
先新增可選 amount_minor 與 currency。所有消費者升級為優先讀新欄、否則回退舊欄,美元事件校驗兩值相等。之後 producer 雙填,再停止新業務讀舊欄。保留歷史 Schema 與轉換至少 90 天;只有 producer 停寫、消費者與離線依賴停讀,而且完整的 90 天重播驗證通過後才刪除舊欄。
分步深入解析
第一階段只擴充 Schema,Registry 與 CI writer/reader 矩陣阻擋不相容版本。消費者先具備新舊雙讀能力。
第二階段 producer 雙填。美元要求 amount_minor == total_cents 且 currency == USD;其他幣種只寫真實最小單位。依版本、消費者和幣種監控覆蓋率、回退與差異。
第三階段停止舊欄業務依賴,但保留相容讀取。重播器按 writer schema ID 轉換,不能用今天的預設值解釋歷史。無法維持相容時改用 v2 topic 和明確轉換器。
最後確認 producer 停寫、回退為零、90 天重播及離線盤點通過,再退役舊欄並保留可回滾版本。
高品質示範回答
採用 expand-migrate-contract:先擴充並升級 reader,再雙填和對帳,最後依證據刪除舊欄。alias 只解決名稱,幣種語意由契約測試與執行時校驗處理。
舊欄保留完整重播窗口。美元雙填不一致時停止擴量,該批次暫以 total_cents 為準並修復 producer;非美元事件繼續以 amount_minor + currency 為準,暫停新增流量或轉入 v2 topic,不能虛構 cents 回退值。舊欄退役後,兩個新欄位成為必填執行時不變條件;所有依賴關閉後才進入 contract 階段。
常見錯誤
- 一次提交直接改名。
- 認為 alias 會轉換金額語意。
- producer 先於 consumer 發布。
- 用目前幣種解釋歷史事件。
- 遺漏離線與重播依賴。
追問與回答
alias 為何不夠?
它協助名稱解析,不能證明不同幣種的業務語意等價。
何時使用 v2 topic?
新舊語意無法在一個相容 Schema 中無歧義表達時。
雙寫不一致怎麼辦?
美元雙填不一致時停止擴量,該批次暫以 total_cents 為準,按 producer 版本隔離、修復並重播。非美元事件繼續以 amount_minor + currency 為準,暫停接入或轉入 v2 topic,不能回退到虛構的 cents 值。
舊欄何時可刪?
producer 停寫、回退歸零、完整重播窗口和離線盤點全部通過後。