# 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）**為方法，步驟如下：

```mermaid
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）

```mermaid
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）

```mermaid
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` 之同步呼叫）。★ **併補建本節**（原檔缺修訂記錄） |
