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 之同步呼叫)。★ 併補建本節(原檔缺修訂記錄) |