ADR-0001: Strangler Fig 遷移協議
- Status: Accepted
- Date: 2026-04-24
- Deciders: Architect、PM Lead、Engineering Lead
- Tags: migration, methodology
Context
任何大型 monolith 遷到新系統都跨多季。即興作業的團隊會得到:
- 跨模組對帳標準不一
- 壞時沒明確 rollback 路徑
- 「Stage 2 多長?」各模組答案不同
- Stakeholder 驚訝(「不是已經上線了?」)
共享協議 + 命名階段 + 量化退出標準解決這四點。
Decision
採用四階段 Strangler Fig 協議(narrative 見 概念:Strangler Fig)。每個模組遷移用相同階段名、對帳門檻、rollback playbook。逐模組 override 在該模組 playbook 明確標註。
四階段
- Stage 0 — Prep:新系統 schema + service + 對帳工具就緒,無流量。Feature flag
migration.<module>.mode = off - Stage 1 — Shadow Read:讀流量仍由舊;新系統並發查詢;diff 記 log。退出:< 0.1% diff × 7 天
- Stage 2 — Double Write:寫雙寫;逐小時對帳。退出:< 0.01% diff × 14 天
- Stage 3 — Cutover:流量切新、舊反向同步保熱、< 5 min rollback。退出:KPI 持平 × 14 天
- Stage 4 — Retire:舊凍結、表唯讀、30 天觀察(金融:跨一次月結;稅法:7 年保留)
逐模組 override
- 金融 / 受監管:對帳容忍度緊 10 倍(< 0.001%);所有寫 HITL 強制;Stage 4 等完整週期
- 高量低關鍵:Stage 1 若 diff 從 day 1 為零可縮至 3 天;Stage 2 若上游冪等可跳
Consequences
Positive
- 跨模組共享詞彙;on-call 與 review 可重用
- Rollback 逐階段演練、不在事故中即興
- Stakeholder 能用 stage % 看進度
- 對帳 job 成為可重用 pattern
Negative
- 雙寫窗內寫 throughput 降 10–20%
- 遷移期間每模組基建成本增 ~30–50%
- Stage 3 反向同步複雜度真實存在
Neutral
- 有些模組 6 週完成、有些 16 週。這是 OK 的
- 舊程式不可在固定日曆刪 — retire 看業務週期
Alternatives Considered
Alternative A: Shadow read → big-bang cutover
- Pros:簡單;無雙寫複雜
- Cons:寫路徑到 cutover 才驗證;交易密集模組風險高
- Rejected:金融模組無法承擔 cutover 風險