如果可以把 ERP 重新做一次,很多舊問題似乎就有機會一起整理。不過,我會先想一件事:這些年累積下來的業務規則,我們真的都找齊了嗎?有些規則可能還留在程式裡,有些則是靠熟悉流程的人記得。
要估重建的時間與成本,得先知道要重建哪些東西。舊 ERP 比較讓人不放心的地方,就是有些規則平常不容易看見,可能要走到特定情境才會出現。因此,盤點能做到多完整,以及漏掉時怎麼處理,都會影響這個選擇。
| 比較 | 一次重建 | 漸進式現代化 |
|---|---|---|
| 上線方式 | 大規模切換 | 依功能逐步導流 |
| 價值產生 | 專案後期 | 每條流程移轉完成時 |
| 新舊共存 | 較短 | 較長 |
| 主要風險 | 規則遺漏、切換失敗 | 雙軌複雜度、資料一致性 |
| 回退 | 困難 | 可依路由回到舊系統 |
我會從兩個時段來看風險。一次重建,要特別注意整體切換那一刻;漸進移轉,則要花比較長的時間注意新舊並存。哪個比較合適,還是要回到業務能停多久,以及團隊能承擔多少雙軌維護工作。

圖 Day 04-1:漸進式現代化。
Strangler Fig 的想法,我覺得可以先理解成:把入口整理好,再一項一項把功能導到新服務。還沒移轉的繼續由 ERP 處理,完成驗證的再切過去,每次都清楚知道誰在負責。
入口整理好,才有地方控制哪些功能走新服務。如果還是每個呼叫端各自改接,切換時就得逐一協調,所以這一步會先安排。
至於一次要移多少,我會先看這一段能不能自己驗證、自己回退。完整的業務流程比較容易說明完成了什麼,也比較容易請使用單位一起確認,所以我會從完整的業務流程來挑。
唯讀功能的範圍比較容易掌握,也適合先拿來演練流量切換、監控與回退:切一部分呼叫過去、看數字有沒有變差、必要時切回舊路徑。所以第一條流程,我會先考慮物料查詢這類唯讀功能。等這些基本工作走順了,再接著評估有寫入與補償需求的交易。
圖裡也保留了 Anti-Corruption Layer,也就是後面幾篇說的 ERP Adapter,讓 ERP 的模型與協定在這一層轉換。新服務用自己的契約處理資料,Day 13、Day 14 再把這份責任說明得更仔細。
後面每次切換,都要有依據。所以真正開始接之前,我會先準備三件事:導流規則的版本、新舊回應的比較方式,以及唯一的寫入路徑。
有些差異原本就允許,例如時間戳記、排序與預設值;範圍沒訂清楚,比對時就會把時間都花在這些地方。所以比較新舊回應前,我會先列出哪些欄位要完全一致,哪些可以不同。
寫入路徑要維持單一來源。所謂雙寫,是同一筆資料同時寫進新服務與 ERP 兩邊。若確實需要雙寫,必須補上主資料來源定義、失敗補償與對帳機制,並明確說明兩邊不一致時以哪一邊為準。這一點在 Day 08 的資料所有權會再展開。
每次切換也要設定 feature flag、觀察期與 rollback 條件。導流比例要能即時調整,並記錄每次調整的時間與操作者;異常發生時才能對應到某一次導流變更,而不是只能從時間上猜測。
| 取捨 | 這樣選的理由 | 何時要重新評估 |
|---|---|---|
| 接受較長的新舊共存期 | 換取單次變更範圍可控且可回退 | 共存期的維護成本已接近重建成本時 |
| 第一條流程選唯讀查詢 | 錯誤影響可控,無寫入衝突與補償問題 | 唯讀流程已驗證完成,需進入寫入情境時 |
| 保留 Adapter 作為長期元件 | 舊系統語意需要有地方承接 | Adapter 開始累積業務規則時(見 Day 14) |
| 導流以 feature flag 控制 | 可快速回退,不需重新部署 | flag 數量多到無法盤點與清理時 |
一步一步移轉,確實比較容易控制每次變更,但兩套系統都要維護的時間也會拉長。所以,每移一項,我都會順便記下舊介面何時可以停用,以及還有哪些依賴要先處理。
| 指標 | 計算方式 | 想回答的問題 |
|---|---|---|
| 新平台流量占比 | 經新服務處理的請求/該流程全部請求 | 移轉是否持續推進? |
| 舊端點退場數 | 已停用的舊介面數/盤點總數 | 舊路徑是否真的收斂,而非只是新增一條? |
| 契約差異數 | 同一請求同時送舊路徑與新服務,逐欄比對回應,超出允許範圍的欄位差異數 | 規則是否被正確搬移? |
| 資料對帳差異率 | 對帳不一致筆數/對帳總筆數 | 共存期間資料是否仍然一致? |
| 回退演練時間 | 從決定回退到服務恢復的時間 | 回退條件是否真的可執行? |
第一條流程就開始收集這些資料,後面才有比較基準。如果契約差異或對帳結果還拿不到,就先把比較機制補好,再繼續擴大導流。
今天比較完兩種方式,我認為最重要的準備是:每一步都能驗證,也知道怎麼回退。下一篇,接著看看微服務、模組化單體與混合架構,各自適合什麼條件。