先分清楚哪些變更真的危險
Schema drift 是實際資料結構偏離預期結構。常見情況包括欄位新增或消失、字串變成數字、必填欄位開始出現空值、日期格式改變,以及 JSON 巢狀層級或陣列元素結構被調整。資料仍可能成功寫入儲存層,卻在報表、特徵工程、RAG 索引或 ERP 同步時才暴露問題,因此只監控管線是否執行成功並不足夠。
工程上應把漂移分成相容、可疑與破壞性變更。新增一個下游未使用的可選欄位通常可以接受;刪除主鍵、改變金額型別或把物件改成陣列,通常必須阻擋。欄位名稱相同也不代表語意相同,例如狀態碼的合法值改變,可能不屬於狹義 schema 變更,卻具有相同的營運風險。
監控嚴格度應依資料用途決定。供內部探索的原始資料區可以先接收再標記;涉及帳務、客戶主檔、權限或自動決策的資料,則需要明確契約與失敗策略。重點不是消除所有變更,而是讓每種變更都有可預期的處理方式。
用資料契約建立可比較的基準
可靠的監控需要一份版本化的預期 schema。它可以來自資料庫 DDL、Avro 或 Protobuf 定義、JSON Schema、資料目錄,或由團隊維護的契約檔。契約至少應描述欄位名稱、型別、是否允許空值、主鍵、巢狀結構與必要欄位;對關鍵資料,還應補充時間格式、列舉值、精度及唯一性等規則。
不要只從單批樣本自動推測 schema。樣本可能剛好沒有空值、缺少罕見欄位,或把數字識別成字串。較穩健的做法是以正式契約為主、觀測資料為輔,並為每個版本產生可比較的指紋。偵測到差異時,系統應輸出結構化差異,而不只是回報驗證失敗。
- 阻擋規則:主鍵消失、必要欄位缺漏、型別不相容或巢狀結構改變。
- 警告規則:新增可選欄位、欄位順序變化,或目前下游尚未使用的擴充。
- 觀測規則:空值率異常、列舉值擴張、字串長度或數值範圍改變。
相容性判斷必須以實際消費者為準。資料湖可以接受的新欄位,未必能通過固定欄位的 ERP 匯入;事件系統中的型別擴充,也可能讓舊版消費者反序列化失敗。契約因此需要記錄擁有者、消費者與生效版本,而不只是保存一份 schema。
在三個邊界偵測,避免只看終點
實務上可在來源入口、轉換完成後及寫入目的地前設置檢查。入口檢查能快速辨識供應端變更;轉換後檢查可捕捉 SQL、ETL 或序列化邏輯造成的欄位遺失;寫入前檢查則保護資料倉儲、搜尋索引與外部系統。若只能先做一處,應優先選擇最靠近不可逆寫入或高風險消費者的邊界。
批次管線可逐檔或逐分區驗證,串流管線則通常需要在事件層驗證,再以時間視窗彙總。不要讓每筆錯誤都觸發一則通知;應依來源、schema 版本和差異類型聚合,並設定持續時間或事件量門檻。另一方面,主鍵消失等高風險變更不應等待彙總才阻擋。
- 比較欄位集合、型別、空值允許規則及巢狀路徑。
- 同時比較宣告的 schema 與實際 payload,避免來源只更新其中一方。
- 保存來源、資料集、契約版本、首次發生時間、差異摘要及下游清單。
- 樣本資料只保存遮罩後內容或安全參照,避免告警與日誌洩漏個資。
儀表板應呈現目前漂移、持續時間、受影響分區、失敗與隔離量,以及最近一次成功版本。告警則必須直接連到資料血緣、契約差異與負責團隊。若值班人員仍要自行搜尋是哪個欄位改變、從何時開始,監控就還沒有完成。
把隔離、相容性與重播納入處理流程
偵測到破壞性變更時,不宜直接丟棄資料,也不應無條件讓錯誤資料流向下游。較安全的模式是停止受影響的發布步驟,把原始事件或檔案送入隔離區,記錄檢查結果,待契約或轉換邏輯修正後再重播。重播機制需要冪等寫入、明確的 checkpoint,以及避免重複通知或重複交易的設計。
團隊也應定義誰有權接受新 schema。低風險新增欄位可以經自動相容性檢查後放行;欄位刪除、重新命名與型別縮窄,通常需要資料擁有者和下游負責人確認。若上下游無法同步升級,可採雙寫欄位、版本化 topic、相容 view 或短期轉接層,並為舊版本設定明確退場條件。
- 先止血:確認是否阻擋發布、隔離資料,或暫時切回上一版轉換。
- 再評估:找出受影響的報表、模型、索引、API 與外部整合。
- 修正與重播:更新契約或轉換程式,先以隔離資料驗證,再依 checkpoint 重跑。
- 避免復發:把這次差異加入契約測試、部署檢查與來源端變更流程。
最後,應定期用模擬漂移測試監控與復原路徑,例如移除必要欄位、改變型別或加入未知巢狀欄位。真正成熟的設計不是永遠不出現 drift,而是能在資料跨越 LINE、ERP、CRM、雲端與 IoT 平台時,快速定位影響、保留原始資料,並以可控方式恢復服務。
