Project

General

Profile

CR #201 » SAD-001_系統架構總覽.md

內容更新:內部稱謂去識別化(2026-10-18) - Redmine Admin, 10/18/2026 05:32 AM

 

SAD-001 系統架構總覽

項目 內容
文件編號 SAD-001
版本 1.0
狀態 已核定
撰寫者 SA
審查者 PM / SEC / TL
對應需求 全案;SYS-2.6、SYS-7、SYS-8、B.3 微服務與雲原生

1. 架構目標與原則

1.1 架構目標

# 目標 對應業務痛點 量測方式
G1 產品規則參數化,新產品不需改碼 P1 新產品上線僅需參數設定
G2 支援多層次帳戶結構 P2 歸戶/卡人/卡/子帳四層可運作
G3 餘額與額度即時更新 P3 繳款後額度恢復 ≤ 1 秒
G4 重複入帳與錯帳可系統性防範 P4 冪等鍵攔阻率 100%
G5 支援新舊系統並存與分批上線 P5 分流熱更新 ≤ 1 分鐘、回退 ≤ 1 分鐘
G6 讀寫分離,尖峰不互斥 P6 授權 P99 ≤ 200 ms、≥ 1,000 TPS

1.2 架構原則(Architecture Principles)

編號 原則 說明 違反後果
AP-01 契約優先(Contract-First) API 以 OpenAPI 3.1 先定義後實作;契約為跨服務唯一介面 服務耦合、無法獨立部署
AP-02 資料私有(Database per Service) 每個服務擁有自己的 schema,不得跨庫直接查詢他服務資料表 無法獨立演進
AP-03 領域純淨(Pure Domain) 業務規則置於 domain/,不依賴框架、資料庫與網路 規則無法單元測試
AP-04 參數驅動(Configuration over Code) 可變之業務規則一律外部化為參數或規則表 違反 GOV-003 §6.1
AP-05 事件驅動(Event-Driven) 跨服務之狀態傳播以事件為之,非同步解耦 服務間時序耦合
AP-06 冪等優先(Idempotent by Design) 所有寫入操作須可重複執行而不產生副作用 重複入帳
AP-07 失敗可見(Fail Loud) 錯誤不得靜默;例外須記錄、告警或補償 違反 GOV-003 §6.1
AP-08 向後相容(Backward Compatible) 契約只增不減;破壞性變更須升版並雙軌 上線中斷
AP-09 可觀測(Observable) 每個請求具備追蹤識別碼,貫穿服務與事件 問題無法定位
AP-10 安全內建(Secure by Default) 預設拒絕、最小權限、個資遮罩 資安風險

2. 系統上下文(Context View)

flowchart LR
  HOLDER["持卡人"]
  MERCHANT["特店與收單機構"]
  ORG["卡組織<br/>VISA / MasterCard / NCCC / JCB / AE"]
  TICKET["票證公司<br/>悠遊卡 / 一卡通 / 愛金卡"]

  subgraph SYS["信用卡核心系統(本專案)"]
    GW["API 閘道"]
    SVC["17 個微服務"]
    GW --> SVC
  end

  CREDIT["徵信與徵審系統"]
  CORE["銀行核心系統<br/>CIF / 存款"]
  GL["總帳系統"]
  HSM["HSM 加密機"]
  NOTIFY["通知通道<br/>簡訊 / 電郵 / 推播 / LINE"]
  CHANNEL["數位通路<br/>行動銀行 / 網銀 / 客服系統"]

  HOLDER --> CHANNEL
  CHANNEL --> GW
  MERCHANT --> SVC
  ORG --> SVC
  TICKET --> SVC
  SVC --> CREDIT
  SVC --> CORE
  SVC --> GL
  SVC --> HSM
  SVC --> NOTIFY
外部系統 互動方向 介面形式 主要用途
徵信與徵審系統 本系統 → 外部 REST / 批次 進件、評分、核決結果
銀行核心系統(CIF/存款) 雙向 REST 客戶主檔、存款帳號、自扣
總帳系統 本系統 → 外部 檔案 / API 會計分錄
HSM 雙向 專用協定 金鑰、PIN、CVV 驗證
卡組織 雙向 ISO 8583 授權、清算
票證公司 雙向 專用協定 加值、餘額轉置
通知通道 本系統 → 外部 REST / 檔案 簡訊、電郵、推播、LINE
數位通路 雙向 REST 客戶端操作與查詢

3. 容器視圖(Container View)

flowchart TD
  subgraph CLIENT["前端"]
    WEB["營運管理平台<br/>React 18 + Vite"]
  end
  subgraph EDGE["邊緣層"]
    GW["API 閘道<br/>路由 / 認證 / 限流"]
    BFF["BFF<br/>前端專用聚合"]
  end
  subgraph DOMAIN["領域服務層"]
    AUTH["authorization-service"]
    LIM["limit-service"]
    CARD["card-service"]
    PTY["party-service"]
    PRD["product-service"]
    POST["posting-service"]
    PAY["payment-service"]
  end
  subgraph SUPPORT["支撐服務層"]
    STM["statement-service"]
    PRC["pricing-service"]
    INS["installment-service"]
    RWD["rewards-service"]
    CLR["clearing-service"]
    DSP["dispute-service"]
    MRC["merchant-service"]
    NOT["notification-service"]
    RPT["report-service"]
    MIG["migration-service"]
  end
  subgraph INFRA["基礎設施"]
    BUS["事件匯流<br/>Kafka"]
    WDB["寫入資料庫<br/>PostgreSQL"]
    RDB["讀取資料庫<br/>PostgreSQL"]
    CACHE["快取<br/>Redis"]
    OBS["可觀測性<br/>日誌 / 指標 / 追蹤"]
  end
  WEB --> GW
  GW --> BFF
  BFF --> AUTH
  BFF --> LIM
  BFF --> CARD
  BFF --> PTY
  BFF --> PRD
  BFF --> POST
  BFF --> PAY
  BFF --> STM
  BFF --> PRC
  BFF --> INS
  BFF --> RWD
  BFF --> CLR
  BFF --> DSP
  BFF --> MRC
  BFF --> NOT
  BFF --> RPT
  BFF --> MIG
  DOMAIN --> BUS
  SUPPORT --> BUS
  DOMAIN --> WDB
  DOMAIN --> RDB
  DOMAIN --> CACHE
  SUPPORT --> WDB
  BUS --> OBS

3.1 容器職責

容器 職責 不負責
API 閘道 路由、認證、授權初篩、速率限制、請求追蹤注入 業務邏輯
BFF 前端專用之資料聚合與裁切、避免前端多次往返 業務規則
領域服務 領域規則、狀態機、交易邊界 前端格式
支撐服務 週期性與批次性業務(帳單、清算、報表) 即時授權
事件匯流 跨服務狀態傳播、非同步解耦、順序保證(分區內) 同步查詢
寫入資料庫 權威資料(Single Source of Truth) 大量查詢
讀取資料庫 查詢最佳化視圖、報表查詢 寫入
快取 授權熱路徑之參數與額度快照 權威資料

4. 分層架構(每個微服務內部)

採六角形架構(Ports & Adapters),依賴方向一律向內:

flowchart TD
  subgraph OUT["外部"]
    HTTP["HTTP 請求"]
    EVT["事件"]
    DB["資料庫"]
    EXT["外部系統"]
  end
  subgraph IFACE["interfaces(介面層)"]
    CTRL["REST Controller"]
    CONS["Event Consumer"]
  end
  subgraph APP["application(應用層)"]
    UC["Use Case / 服務編排"]
    TX["交易邊界"]
  end
  subgraph DOM["domain(領域層)"]
    ENT["Entity / Aggregate"]
    VO["Value Object"]
    RULE["業務規則"]
    EV["Domain Event"]
  end
  subgraph INFRA2["infrastructure(基礎層)"]
    REPO["Repository 實作"]
    PUB["Event Publisher"]
    ADP["外部系統適配器"]
    OBX["Outbox"]
  end
  HTTP --> CTRL
  EVT --> CONS
  CTRL --> UC
  CONS --> UC
  UC --> ENT
  UC --> RULE
  UC --> REPO
  UC --> PUB
  REPO --> DB
  ADP --> EXT
  PUB --> OBX

4.1 依賴規則(強制)

規則 說明 自動化檢查
DR-01 domain/ 不得 import application/、interfaces/、infrastructure/ 依賴掃描
DR-02 domain/ 不得 import 任何框架、ORM、HTTP、日誌套件 依賴掃描
DR-03 application/ 只能 import domain/ 與其自身之埠(port)介面 依賴掃描
DR-04 infrastructure/ 實作 application/ 定義之埠 依賴掃描
DR-05 服務之間不得直接 import 彼此的程式碼 依賴掃描
DR-06 服務之間不得跨庫查詢 schema 權限檢查

違反 DR-01~DR-05 由 CSP-002 §5 之依賴掃描於 CI 阻擋。


5. 關鍵架構決策(ADR 摘要)

編號 決策 選項 採用 理由
ADR-01 服務切分方式 分層切分/領域切分 領域切分(DDD) 對齊業務能力,降低跨服務交易
ADR-02 跨服務一致性 分散式交易/Saga/事件最終一致 Saga + 事件最終一致 避免分散式鎖;授權為即時、帳務可補償
ADR-03 讀寫分離 單庫/讀寫分離/CQRS CQRS(寫主讀從) 滿足 POC-14 之 1 秒同步與尖峰查詢
ADR-04 事件傳遞 同步呼叫/訊息佇列/事件流 事件流(Kafka) 順序保證、可重播、解耦
ADR-05 授權熱路徑 直查資料庫/快取 快取 + 資料庫雙寫 滿足 P99 ≤ 200 ms
ADR-06 參數化規則 資料庫參數表/規則引擎 規則表 + 規則引擎 支援多維度組合與版本化
ADR-07 冪等實作 資料庫唯一鍵/分散式鎖 唯一鍵 + 請求指紋 無需額外元件,交易內保證
ADR-08 金額型別 浮點/定點小數/整數最小單位 整數最小單位(分) 避免浮點誤差(C-01)
ADR-09 新舊系統並存 停機切換/雙軌並行/分流 分流(Cycle Split) 滿足 P5、POC-13
ADR-10 技術棧 見 §7 見 §7 依業主裁定

6. 品質屬性與架構戰術

品質屬性 目標 架構戰術
效能 授權 P99 ≤ 200 ms 熱路徑快取、參數預載、非同步寫入、連線池
吞吐 ≥ 1,000 TPS 水平擴充、分區、無狀態服務
可用度 ≥ 99.99% 多副本、健康檢查、斷路器、降級、Stand-in
一致性 授權帳務一致率 ≥ 99.99% 事件溯源、Outbox、對帳補償
可修改性 新產品不改碼 參數化、規則引擎、契約優先
可測試性 領域層覆蓋率 ≥ 90% 領域純淨、埠/轉接器、依賴注入
可觀測性 全鏈路追蹤 追蹤識別碼貫穿、結構化日誌、指標
安全性 個資不外洩 加密、遮罩、最小權限、稽核軌跡
可運維性 回退 ≤ 1 分鐘 分流熱更新、藍綠部署、Runbook

7. 技術棧與埠/轉接器對照

7.1 技術棧(參考實作棧)

層 選型 版本
語言 TypeScript 5.x(strict)
執行環境 Node.js 22 LTS
HTTP 框架 Fastify 4.x
契約 OpenAPI 3.1
資料庫 PostgreSQL 16
事件 Kafka 3.x
快取 Redis 7.x
前端 React + Vite 18 / 5.x
測試 Vitest 2.x
容器 Docker + Compose(本機)/K8s(生產) —

選型理由:① 可於本環境立即建置與測試(本機無 Java/Maven/Docker daemon);
② 與雲原生、容器化部署一致;③ 契約(OpenAPI)與事件(JSON Schema)皆語言中立。

7.2 埠/轉接器對照表(若業主指定 Java 21 + Spring Boot 3)

本架構之領域層與契約層不受技術棧影響。切換技術棧時僅需替換基礎層轉接器:

埠(Port,不變) TypeScript 轉接器 Java 轉接器
Repository<T> Prisma / pg Spring Data JPA
EventPublisher KafkaJS Spring Kafka
CacheStore ioredis Spring Data Redis
HttpServer Fastify Spring Web MVC
HsmClient 自建適配器 自建適配器
OrgGateway(卡組織) 自建適配器(ISO 8583) 自建適配器(jPOS)
Clock 系統時鐘 java.time.Clock
IdGenerator ULID ULID

決策點:實際開發環境由業主於程式撰寫階段指定(GOV-003 §4 條件 8)。
無論選用何者,SDD-000~007 之設計與 SDD-006 之 API 契約均不需變更。


8. 架構檢核

檢核項 標準 對應
服務數與邊界 17 個服務,一服務一 bounded context SAD-002
依賴規則 DR-01~DR-06 全數可由 CI 驗證 CSP-002 §5
契約覆蓋 所有對外 API 皆有 OpenAPI 契約 SDD-006
事件覆蓋 所有跨服務狀態傳播皆有事件定義 SAD-004 §5
個資處理 所有個資欄位皆有加密或遮罩設計 SAD-005 §5
可觀測性 所有服務具備追蹤、日誌、指標 SAD-006 §5
無反模式 架構文件中無 mock/stub 設計 GOV-003 §6
(5-5/67)