具代表性的面試主題

資料工程面試:事件欄位改名如何安全發布?

資料困難
OfferCC 編輯團隊發佈 更新

題幹

訂單事件要把 `total_cents` 改名為 `amount_minor`,並允許非美元幣種。12 個消費者獨立發布,歷史可重播 90 天。你會如何發布這次欄位名稱與語意遷移?

題幹與適用情境

這次遷移同時改變欄位名稱與業務語意: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 停寫、回退歸零、完整重播窗口和離線盤點全部通過後。

公開來源

同類題目