Project

General

Profile

CR #201 » SAD-002_微服務劃分與DDD邊界.md

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

 

SAD-002 微服務劃分與 DDD 邊界

項目 內容
文件編號 SAD-002
版本 1.2(2026-10-02,CR-033:清理事件欄之殘留記載——§3.6/§3.7 之「事件(訂閱)」加刪除線並註明「已非消費者」;§3.9~3.17 之「主要相依」欄加註「為同步相依、非事件訂閱」(此欄曾被誤讀為消費邊,致 CR-029 產生 C-5 幽靈待辦)。★ 並新增 §8 修訂記錄(原檔缺,無法追溯)。前版 1.1(2026-10-01,CR-028:hold 事件群四項矛盾之化解——§3.1 authorization-service 之「事件(發布)」移除 authorization.hold.created.v1/authorization.hold.released.v1(同一事實兩個生產者);「事件(訂閱)」補 limit.hold.created.v1/limit.hold.released.v1(供本地 limit_holds 投影)。前版 1.0)
狀態 已核定
撰寫者 SA
審查者 BA / DA / TL
對應需求 SYS-2.6、SYS-7、SYS-8、B.3 微服務架構原則

1. 邊界劃分方法

採**事件風暴(Event Storming)**為方法,步驟如下:

flowchart LR
  A["① 列舉領域事件<br/>交易已授權 / 已入帳 / 已出帳"] --> B["② 標記命令<br/>取授權 / 請款 / 繳款"]
  B --> C["③ 識別聚合<br/>授權 / 帳務 / 卡片"]
  C --> D["④ 圈出限界上下文<br/>依聚合群組"]
  D --> E["⑤ 檢視語言一致性<br/>同一詞在不同上下文之意義"]
  E --> F["⑥ 定義上下文映射<br/>上下游與防腐層"]
  F --> G["⑦ 對映為微服務<br/>一上下文一服務"]

1.1 同名異義(需以限界上下文隔離)

詞彙 上下文 A 之意義 上下文 B 之意義 處置
額度 卡片可用額度(授權用) 帳務應繳額度(帳單用) 分屬 limit-service 與 statement-service
餘額 可用額度餘額(授權) 帳務本金餘額(帳務) 分屬 limit-service 與 posting-service
交易 授權交易 帳務交易 分屬 authorization-service 與 posting-service
分期 分期計畫 分期帳務攤還 分屬 installment-service 與 posting-service
點數 回饋點數 折抵金額 分屬 rewards-service 與 authorization-service

2. 服務清單(17 個)

2.1 領域服務(8)

# 服務 限界上下文 核心聚合 資料庫 schema
1 authorization-service 授權 Authorization, AuthHold authorization
2 limit-service 額度 CreditLimit, LimitHold, SpecialLimit limit
3 card-service 卡片 Card, CardApplication, Token card
4 party-service 持卡人 Party, Account, BlockCode party
5 product-service 產品與參數 Product, Parameter, RuleSet product
6 posting-service 帳務 Transaction, Balance, SubAccount posting
7 payment-service 繳款 Payment, AutoDebitEnrollment payment
8 merchant-service 商戶 Merchant, MerchantSettlement merchant

2.2 支撐服務(9)

# 服務 限界上下文 核心聚合 資料庫 schema
9 statement-service 帳單 Statement, StatementCycle statement
10 pricing-service 定價 PricingRule, InterestCalc, FeeCalc pricing
11 installment-service 分期 InstallmentPlan installment
12 rewards-service 點數 PointsAccount, RewardRule, Redemption rewards
13 clearing-service 清算 ClearingBatch, Reconciliation clearing
14 dispute-service 爭議 DisputeCase, Chargeback dispute
15 notification-service 通知 NotificationTemplate, NotificationJob notification
16 report-service 報表 ReportJob, ReportDefinition report
17 migration-service 遷移 MigrationJob, LegacyMapping migration

2.3 平台模組(3)

# 模組 職責 不負責
P1 platform/common 錯誤碼、事件信封、Outbox、冪等、追蹤、審計、時鐘、識別碼 業務規則
P2 platform/gateway 路由、認證、授權初篩、限流、追蹤注入 業務邏輯
P3 platform/bff 前端聚合查詢、欄位裁切 業務規則

3. 服務職責與邊界

★ 本節各服務表之「事件(發布)/(訂閱)」欄為「服務視角之指標」——
事件之唯一權威清單為 SAD-004 §5.2(CR-030 §2 #5 裁定 (c):合併為單一清單)。
兩者衝突時一律以 SAD-004 §5.2 為準;本節僅供快速定位「此服務與哪些事件有關」。

⚠️ 「同步呼叫」欄為現行實作;依 CR-030 §2 #16 裁定 (b)「同步為主、事件為輔」,
事件不得重做同步呼叫已完成之寫入(否則重複套用)。

3.1 authorization-service(授權)

職責:受理授權請求、執行 13 大項檢核、產生授權決策、佔用額度、Stand-in 代授權。

項目 內容
聚合根 Authorization
命令 AuthorizeTransaction、ReverseAuthorization、AdviceAuthorization、CancelAuthorization
事件(發布) authorization.authorization.approved.v1、authorization.authorization.declined.v1
事件(訂閱) limit.hold.created.v1、limit.hold.released.v1、card.card.status-changed.v1、product.parameter.changed.v1
同步呼叫 limit-service(額度檢核與佔用)、card-service(卡片狀態)、product-service(參數)
不負責 帳務入帳(posting-service)、清算(clearing-service)

13 大項檢核(順序與啟用皆由 product-service 之參數決定):
授權檢核項目定義、檢核順序定義、完整/快速檢核、交易欄位校驗、VIP 白名單、
個人化參數控管、超額及容差檢核、風險參數控管、公司卡參數控管、專用額度控管、
國旅不良戶控管、EMV 交易驗證、預借現金控管。

3.2 limit-service(額度)

職責:管理歸戶/卡人/卡三層額度、永久/臨時/專用/彈性額度、授權佔用與釋放。

項目 內容
聚合根 CreditLimit、LimitHold、SpecialLimit
命令 AdjustLimit、CreateHold、ReleaseHold、SetSpecialLimit、ExpireTempLimit
事件(發布) limit.limit.adjusted.v1、limit.hold.created.v1、limit.hold.released.v1、limit.special-limit.set.v1
事件(訂閱) posting.transaction.posted.v1(釋放佔用 + 8-6 調高臨時額度)、payment.payment.posted.v1(恢復額度 + 8-7 回收)、★ statement.statement.issued.v1(CR-036:以帳單之權威 paymentDueDate 校正 8-6 之迄日)
同步呼叫 product-service(額度政策參數)
不負責 授權決策(authorization-service)

3.3 card-service(卡片)

職責:卡片全生命週期、卡號給號、Token 管理、票證連結、快發快綁。

項目 內容
聚合根 Card、CardApplication、Token
命令 CreateApplication、ApproveApplication、IssueCard、ActivateCard、TransitionCardStatus、BindToken、InstantIssuance
事件(發布) card.card.issued.v1、card.card.status-changed.v1、card.token.bound.v1
事件(訂閱) party.account.created.v1
同步呼叫 party-service(歸戶)、product-service(產品與版面)
不負責 徵審評分(外部系統)

3.4 party-service(持卡人)

職責:持卡人與歸戶主檔、貼標、客層、管制碼、附加服務資格。

項目 內容
聚合根 Party、Account、BlockCode
命令 RegisterParty、CreateAccount、ApplyFlag、SetBlockCode、UpdateContact
事件(發布) party.account.created.v1、party.block-code.changed.v1、party.flag.applied.v1
事件(訂閱) card.card.status-changed.v1
同步呼叫 銀行核心系統(CIF)
不負責 額度(limit-service)

3.5 product-service(產品與參數)

職責:產品架構(P0–P3)、參數管理、規則集版本化、生效日排程。

項目 內容
聚合根 Product、Parameter、RuleSet
命令 CreateProduct、UpdateProduct、SetParameter、PublishRuleSet、ScheduleEffective
事件(發布) product.parameter.changed.v1、product.product.published.v1
事件(訂閱) —
同步呼叫 —
不負責 業務交易

本服務為 AP-04 參數驅動 之落實處:所有 BRD-001 §6 標記 P 之規則,
皆須以本服務之參數表達。

3.6 posting-service(帳務)

職責:入帳、分欄位、沖銷、帳齡、錯帳沖正、冪等保護。

項目 內容
聚合根 Transaction、Balance、SubAccount
命令 PostTransaction、ReverseTransaction、AdjustTransaction、RecalculateInterest
事件(發布) posting.transaction.posted.v1、posting.transaction.reversed.v1、posting.balance.changed.v1
事件(訂閱) authorization.authorization.approved.v1、payment.payment.posted.v1、installment.plan.created.v1 ⚠️ 三者皆已非消費者(CR-030 §4.1:approved/payment.posted 屬「同步已做」;installment.plan.created 生產端未實作)——現行消費者見 SAD-004 §5.2(CR-033 §3.1)
同步呼叫 pricing-service(計息與費用)
不負責 帳單產製(statement-service)

3.7 payment-service(繳款)

職責:繳款受理(自扣/臨櫃/ATM/超商)、銷帳、繳款分配、即時恢復額度。

項目 內容
聚合根 Payment、AutoDebitEnrollment
命令 ReceivePayment、AllocatePayment、EnrollAutoDebit、ReversePayment、ReoccupyIfUnmatched
事件(發布) payment.payment.posted.v1、payment.payment.reversed.v1
事件(訂閱) statement.statement.issued.v1 ⚠️ 已非消費者(CR-030 §4.1)——「出帳後觸發自扣」屬未實作功能(SCS-008 §10),非事件消費(CR-033 §2.1)
同步呼叫 limit-service(恢復額度)、posting-service(入帳)
不負責 帳單產製

3.8 merchant-service(商戶)

職責:特店主檔、商店型態、手續費設定、商店請款、對帳單。

項目 內容
聚合根 Merchant、MerchantSettlement
命令 RegisterMerchant、UpdateMerchant、SetMerchantFee、SubmitSettlement
事件(發布) merchant.merchant.registered.v1、merchant.settlement.submitted.v1
事件(訂閱) —
同步呼叫 pricing-service(手續費)

3.9~3.17 其餘服務(摘要)

服務 核心聚合 主要事件 主要相依
statement-service Statement, StatementCycle statement.statement.issued.v1 posting, party
pricing-service PricingRule, InterestCalc pricing.interest.calculated.v1 product
installment-service InstallmentPlan installment.plan.created.v1、installment.period.settled.v1 limit, posting
rewards-service PointsAccount, RewardRule rewards.points.accrued.v1、rewards.points.redeemed.v1 product, posting
clearing-service ClearingBatch, Reconciliation clearing.batch.matched.v1 posting, merchant
dispute-service DisputeCase dispute.case.opened.v1、dispute.case.closed.v1 posting, clearing
notification-service NotificationJob notification.sent.v1 party
report-service ReportJob report.job.completed.v1 各服務(讀取)
migration-service MigrationJob migration.job.completed.v1 posting, card, party

⚠️ 「主要相依」欄為「同步呼叫」相依,不是「事件訂閱」(CR-033 §3.1 之揭露)——
例:rewards/clearing/dispute 之 posting 相依係 SDD-003 §13/§14/§15 之同步呼叫
(產生分錄),並非訂閱 posting.* 事件。
本欄曾被誤讀為消費邊(CR-029 之 C-5 幽靈待辦即源於此)→ 特此標明。
事件之權威清單一律為 SAD-004 §5.2。


4. 上下文映射(Context Map)

flowchart TD
  PRD["product-service<br/>【上游 / 開放主機服務】"]
  PTY["party-service<br/>【上游 / 開放主機服務】"]
  CARD["card-service"]
  LIM["limit-service"]
  AUTH["authorization-service"]
  POST["posting-service"]
  PAY["payment-service"]
  STM["statement-service"]
  PRC["pricing-service"]
  INS["installment-service"]
  RWD["rewards-service"]
  CLR["clearing-service"]
  DSP["dispute-service"]
  MRC["merchant-service"]
  NOT["notification-service"]

  PRD -->|"參數(開放主機服務)"| LIM
  PRD -->|"參數"| AUTH
  PRD -->|"參數"| POST
  PRD -->|"參數"| RWD
  PTY -->|"歸戶(開放主機服務)"| CARD
  PTY -->|"歸戶"| STM
  CARD -->|"卡片狀態(客戶 / 供應商)"| AUTH
  LIM -->|"額度佔用(共享核心)"| AUTH
  AUTH -->|"授權事件(發布語言)"| POST
  PAY -->|"繳款事件"| POST
  PAY -->|"繳款事件"| LIM
  POST -->|"帳務事件"| STM
  POST -->|"帳務事件"| RWD
  POST -->|"帳務事件"| CLR
  INS -->|"分期事件"| POST
  RWD -->|"點數事件"| POST
  STM -->|"帳單事件"| NOT
  DSP -->|"爭議事件"| POST
  MRC -->|"商戶事件"| CLR

4.1 上下文關係型態

關係 上游 → 下游 型態 說明
參數供應 product-service → 各服務 開放主機服務(OHS) 以穩定契約提供參數
客戶主檔 party-service → card / statement 開放主機服務 歸戶為權威來源
授權→帳務 authorization-service → posting-service 發布語言(PL) 事件契約為公開語言
額度佔用 limit-service ↔ authorization-service 共享核心(Shared Kernel) 佔用模型為兩者共識
外部系統 徵審 / 核心 / 卡組織 → 本系統 防腐層(ACL) 外部模型不得滲入領域層

4.2 防腐層(Anti-Corruption Layer)

外部系統 防腐層位置 職責
卡組織(ISO 8583) authorization-service/infrastructure/org-gateway 電文 ↔ 領域模型轉換
徵審系統 card-service/infrastructure/credit-adapter 外部評分 ↔ 內部核決模型
銀行核心(CIF) party-service/infrastructure/cif-adapter CIF 欄位 ↔ Party 模型
總帳系統 clearing-service/infrastructure/gl-adapter 會計分錄 ↔ GL 格式
HSM authorization-service/infrastructure/hsm-adapter 金鑰操作封裝
通知通道 notification-service/infrastructure/channel-adapter 統一通道介面

5. 服務互動矩陣

S=同步(HTTP) A=非同步(事件) —=無直接互動

呼叫者 \ 被呼叫 auth limit card party product posting payment statement pricing installment rewards clearing merchant notification
authorization — S S — S — — — — — — — — —
limit — — — — S — — — — — — — — —
card — — — S S — — — — — — — — A
party — — A — — — — — — — — — — —
product — A A — — A — A A A A — — —
posting — A — — S — — A S — A A — A
payment — S — — — S — — — — — — — A
statement — — — S S S — — — — — — — A
pricing — — — — S — — — — — — — — —
installment — S — — S A — — S — — — — —
rewards — — — S S S — — — — — — — A
campaign — — — — — — — — — — S — — —
clearing — — — — — A — — — — — — A —
merchant — — — — S — — — S — — A — —
dispute — — — — — S — — — — — S — A

★ 2026-10-17 補列(SCS-026 §7.13 R-3):campaign-service(CR-046 新增)之列原漏列於本矩陣
——補上 campaign → rewards=S(取點數帳戶層級 tier,供條件式比率 minLevel 判定;
端點 GET /api/v1/rewards/accounts/{accountId})。被呼叫欄(campaign 為被呼叫者)目前無需求,
待有同步查詢需求時再加欄。

設計約束:

  • 同步呼叫僅允許「查詢型」或「即時必要之檢核」;狀態變更一律以事件傳播(AP-05)。
  • 同步呼叫鏈長度不得超過 3 層,避免級聯失敗。
  • 所有同步呼叫須設逾時、重試(指數退避)與斷路器。

6. 新舊系統並存與分流架構

6.1 分流機制(Cycle Split)

flowchart TD
  TX["交易進入"] --> SPLIT{"分流決策"}
  SPLIT -->|"比例內"| NEW["新系統處理"]
  SPLIT -->|"比例外"| OLD["舊系統處理"]
  NEW --> CMP["並行比對"]
  OLD --> CMP
  CMP --> R{"結果一致"}
  R -->|"是"| OK["累積達標"]
  R -->|"否"| DIFF["差異分析與修正"]
  OK --> RATIO["調整分流比例"]
  RATIO --> SPLIT
  DIFF --> RATIO

6.2 分流規則

規則 說明
分流維度 商店代號(收單)、卡號區段(發卡)、帳單週期群組(帳務)
鐵律 同一歸戶不得跨波次(BRD-001 §10.3 C-03)
熱更新 分流比例調整 ≤ 1 分鐘生效,無需重啟
回退 回退完成 ≤ 1 分鐘
佐證 每一筆轉接須留有 LOG 與追蹤識別碼(POC-13)
出口條件 並行驗證一致率 ≥ 99.99%、A 類差異 0、連續達標 3 個帳務週期

6.3 波次與系統對應

波次 分流比例 承接範圍 舊系統角色
W0 0% 影子期(唯讀比對) 全部
W1 1% → 5% → 25% 灰度 其餘
W2 25% → 50% 首波正式 其餘
W3 50% → 80% 第二波 其餘
W4 80% → 100% 全量 退場準備

7. 服務獨立性驗證

檢核項 標準 方法
一服務一 schema 每個服務僅擁有自己的 schema 資料庫權限檢查
無跨庫查詢 服務不得查詢他人 schema schema GRANT 掃描
無共享程式碼(除 common) 服務間無 import 依賴掃描
可獨立部署 單一服務可獨立建置與啟動 CI 逐服務建置
可獨立測試 單一服務之單元測試不依賴其他服務 測試隔離檢查
契約穩定 對外契約有版本且向後相容 契約 diff 檢查
資料所有權 每張表僅一個服務可寫 schema 寫入權限

8. 修訂記錄

⚠️ 本節為 2026-10-02 補建——原檔無修訂記錄,版本列之歷程無法逐版追溯(屬 GOV-001 之文件治理缺陷)。

版本 日期 修訂內容
1.0 2026-09-18 初版:邊界劃分方法、17 服務清單、服務職責與邊界、上下文映射、服務互動矩陣、新舊並存與分流架構、服務獨立性驗證
1.1 2026-10-01 CR-028 hold 事件群四項矛盾之化解——§3.1 authorization-service 之「事件(發布)」移除 authorization.hold.created.v1/authorization.hold.released.v1(同一事實兩個生產者);「事件(訂閱)」補 limit.hold.created.v1/limit.hold.released.v1
1.2 2026-10-02 CR-033:清理事件欄之殘留記載(C-5 幽靈待辦之根因)。(i) §3.6 posting-service 與 §3.7 payment-service 之「事件(訂閱)」加刪除線並註明「已非消費者」(CR-030 §4.1:屬「同步已做」或「生產端未實作」);(ii) §3.9~3.17 之「主要相依」欄加註——該欄為「同步呼叫」相依,不是「事件訂閱」(例:rewards/clearing/dispute 之 posting 相依係 SDD-003 §13/§14/§15 之同步呼叫)。★ 併補建本節(原檔缺修訂記錄)
(19-19/67)