Schema Inspector 與 Dry Run Plan 串接服務設計

Schema Inspector 與 Dry Run Plan 串接服務設計

返回 docs

Schema Inspector 與 Dry Run Plan 串接服務設計

1. 文件目的

本文件整理 Schema InspectorDry Run Plan 之間是否需要一個串接服務,以及該服務的責任邊界、輸入輸出、錯誤處理與測試案例。

暫定服務名稱為:

SchemaDryRunPlanner

本節點仍屬於設計整理,不導入 MySQL 套件、不連線資料庫、不查詢 information_schema,也不執行 DDL。

2. 為什麼需要串接服務

目前已完成:

已有元件責任
ISchemaInspector取得目前 schema snapshot
MockSchemaInspector不連 DB 的 schema snapshot 來源
SchemaDefinition表示目標 schema 或目前 DB schema
MySqlSchemaSqlGenerator產生 CREATE TABLEADD COLUMNADD INDEX 與 Dry Run Plan
SchemaMigrationPlan表示 schema 差異與建議 SQL

若未建立串接服務,未來 ConsoleHost、Schema Initializer 或測試程式可能會各自手動組合:

1. 呼叫 inspector。 2. 判斷 inspector 是否失敗。 3. 呼叫 SQL generator。 4. 合併 warnings。 5. 回傳 plan 或 error。

這會讓錯誤處理與流程組合分散。建立 SchemaDryRunPlanner 可把這段流程集中,讓後續真實 MySQL inspector 或 ConsoleHost 只接同一個入口。

3. 建議責任邊界

責任是否屬於 SchemaDryRunPlanner說明
呼叫 ISchemaInspector取得目前 schema snapshot
接收目標 SchemaDefinition目標 schema 由 Schema Parser 或呼叫端提供
呼叫 GenerateDryRunPlan產生差異計畫
合併 inspector warnings 與 plan warnings讓呼叫端一次取得完整提醒
回傳標準結果需包含 success、plan、error、warnings
連線 MySQL由真實 inspector 負責
查詢 information_schema由真實 inspector 負責
執行 DDL由後續 executor / initializer 負責
ConsoleHost 顯示Host 只負責呈現

4. 建議模型

4.1 SchemaDryRunRequest

欄位說明
TargetSchema目標 schema definition
InspectRequest傳給 ISchemaInspector 的讀取條件
CorrelationId可選,方便串接 log 與驗證紀錄

4.2 SchemaDryRunResult

欄位說明
Success是否成功產生 dry run plan
PlanSchemaMigrationPlan
Warningsinspector 與 plan 的合併提醒
Error失敗時的標準錯誤資訊
TimeTakenMs串接流程耗時

5. 建議流程

Target Schema
    |
    v
SchemaDryRunPlanner
    |
    +--> ISchemaInspector.Inspect()
    |       |
    |       v
    |   Current Schema Snapshot
    |
    +--> MySqlSchemaSqlGenerator.GenerateDryRunPlan(target, current)
            |
            v
        SchemaMigrationPlan

6. 錯誤處理規則

情境建議處理
request 為 null回傳失敗 result
target schema 為 null回傳失敗 result
inspector 為 null建構或執行時回傳失敗 result
generator 為 null建構或執行時回傳失敗 result
inspector 失敗直接回傳失敗 result,保留 inspector error
generator 失敗回傳失敗 result,保留 plan error
inspector warnings合併到 result warnings
plan warnings合併到 result warnings

不得只回傳 bool,也不得吞掉 exception。

7. 測試案例建議

測試案例驗證目的
mock inspector 回傳完整 schemaplan 成功且不產生 SQL
mock inspector 回傳空 schemaplan 產生 create table
mock inspector 缺少 column / indexplan 產生 add column / add index
mock inspector 欄位型別不同plan 產生 manual review
inspector 回傳失敗planner 回傳失敗並保留 error
inspector warningsplanner result 包含 warnings
request 為 nullplanner 回傳標準錯誤
target schema 為 nullplanner 回傳標準錯誤
不執行 DDL測試確認只產生 plan,不連線、不執行 SQL

8. 建議放置位置

SchemaDryRunPlanner 建議先放在 Core 的 Schema 區,原因:

但後續真實 MySqlSchemaInspector 與 DDL executor 不應放入 Core。

9. 明確不納入

不納入項目原因
MySqlConnector此節點不需要真實連線
information_schema SQL真實 inspector 節點再處理
DDL executor高風險,需另行確認
ConsoleHost 自動建表需等 planner 與 executor 邊界完成
Secret / password此節點不需要任何敏感資訊

10. 建議決策

建議採用 SchemaDryRunPlanner,先做一個不執行 DDL 的純流程服務。

這樣下一步可以安全實作:

11. 建議下一步

若本設計確認,下一步可進入:

SchemaDryRunPlanner 第一版實作

建議實作內容:

仍不做: