3. 支付订单核心领域分析:识别支付订单领域的核心子域
在支付订单系统中,领域驱动设计(DDD)要求我们首先通过核心子域的识别来划定业务边界。支付订单领域并非单一实体,而是由多个相互协作的子域构成。本章将深入分析订单、支付、账户、结算、风控这五个核心子域,明确各自的职责、边界以及它们之间的协作关系。
3.1 核心子域全景概览
支付订单系统的核心子域可以归纳为以下五个,它们共同构成了完整的支付交易生命周期:
| 子域名称 | 核心职责 | 关键实体/聚合根 | 典型业务场景 |
|---|---|---|---|
| 订单子域 | 管理交易订单的生命周期,记录商品/服务信息、金额、状态 | Order(订单)、OrderItem(订单项) | 用户下单、订单取消、订单超时关闭 |
| 支付子域 | 处理支付指令的发起、执行与结果确认,对接外部支付渠道 | Payment(支付单)、PaymentTransaction(支付流水) | 发起支付、支付回调处理、退款 |
| 账户子域 | 管理用户及商户的资金账户,记录余额变动与流水 | Account(账户)、AccountJournal(账户流水) | 账户充值、余额扣减、账户冻结 |
| 结算子域 | 负责交易完成后的资金清算、分账与对账 | Settlement(结算单)、ClearingRecord(清算记录) | 商户结算、平台分账、每日对账 |
| 风控子域 | 实时评估交易风险,拦截可疑操作,保障资金安全 | RiskRule(风控规则)、RiskEvent(风险事件) | 交易风险评估、黑名单校验、限频控制 |
领域划分原则:每个子域应拥有独立的数据库或数据存储边界,避免跨子域直接操作数据表。子域之间通过领域事件或应用服务接口进行通信,确保高内聚、低耦合。
3.2 子域职责与边界详解
3.2.1 订单子域(Order Subdomain)
订单子域是交易流程的起点,负责记录用户购买了什么、花了多少钱、当前处于什么状态。它不关心资金如何流转,只关心订单本身的业务语义。
- 聚合根:Order(订单),包含订单号、用户ID、总金额、订单状态(待支付/已支付/已取消/已完成)。
- 核心行为:创建订单、修改订单(如地址变更)、取消订单、查询订单。
- 边界:订单子域不直接调用支付接口,而是通过发布
OrderCreated领域事件触发支付流程。
3.2.2 支付子域(Payment Subdomain)
支付子域是资金流转的执行层,负责与外部支付网关(如支付、支付宝)交互,并确保支付结果的最终一致性。
- 聚合根:Payment(支付单),包含支付单号、关联订单号、支付金额、支付渠道、支付状态(待支付/支付中/成功/失败)。
- 核心行为:发起支付、处理支付回调、发起退款、查询支付结果。
- 边界:支付子域不直接修改订单状态,支付成功后通过
PaymentSucceeded事件通知订单子域更新状态。
3.2.3 账户子域(Account Subdomain)
账户子域是资金的静态存储层,管理用户余额、商户余额以及各类资金流水。它是结算和风控的基础数据源。
- 聚合根:Account(账户),包含账户ID、账户类型(用户/商户/平台)、可用余额、冻结余额。
- 核心行为:资金入账、资金出账、余额冻结/解冻、查询账户流水。
- 边界:账户子域只负责记账,不负责支付指令的发送。支付成功后的资金入账由结算子域触发。
3.2.4 结算子域(Settlement Subdomain)
结算子域是资金流转的清算层,负责将交易资金从用户账户划转至商户账户,并处理平台抽成、分账等复杂逻辑。
- 聚合根:Settlement(结算单),包含结算单号、关联支付单号、结算金额、结算状态(待结算/已结算/结算失败)。
- 核心行为:生成结算单、执行资金划转、处理分账、每日对账。
- 边界:结算子域依赖账户子域提供的账户操作接口,但结算逻辑本身独立于账户的底层实现。
3.2.5 风控子域(Risk Control Subdomain)
风控子域是安全防护层,在交易的关键节点(如支付发起、退款发起)进行实时风险评估,防止欺诈、盗刷等风险行为。
- 聚合根:RiskRule(风控规则),包含规则ID、规则类型(黑名单/限频/金额阈值)、规则参数。
- 核心行为:交易风险评估、规则匹配、风险事件记录、触发人工审核。
- 边界:风控子域不参与资金流转,仅提供评估结果(通过/拒绝/人工审核),由支付子域根据结果决定是否继续执行。
3.3 子域协作关系与领域事件流
下图展示了五个核心子域之间的典型协作流程,以一次成功的支付交易为例:
关键设计要点:领域事件是子域解耦的核心。订单子域无需知道支付子域的具体实现,只需监听
PaymentSucceeded 事件即可更新订单状态。这种事件驱动架构使得每个子域可以独立演进和部署。
3.4 子域边界与数据一致性策略
由于每个子域拥有独立的数据库,跨子域的数据一致性成为设计难点。以下是针对不同场景的一致性策略:
| 场景 | 涉及子域 | 一致性要求 | 推荐策略 |
|---|---|---|---|
| 用户下单 | 订单 → 支付 | 最终一致性 | 事件驱动 + 本地消息表(可靠消息) |
| 支付回调 | 支付 → 订单 | 最终一致性 | 幂等处理 + 状态机重试 |
| 资金划转 | 结算 → 账户 | 强一致性 | 本地事务 + 分布式锁(或 TCC) |
| 风险评估 | 支付 → 风控 | 最终一致性 | 同步 RPC 调用 + 超时降级 |
避坑提示:不要试图在跨子域操作中使用分布式事务(如 XA 协议),这会导致系统性能急剧下降且复杂度飙升。优先采用最终一致性 + 幂等处理的方案,仅在资金类操作中谨慎使用强一致性策略。
3.5 子域与聚合的映射关系
为了帮助你在实际建模中快速落地,下表总结了每个子域对应的聚合根及其关键属性:
| 子域 | 聚合根 | 关键属性(示例) | 领域事件(示例) |
|---|---|---|---|
| 订单 | Order | orderId, userId, totalAmount, status | OrderCreated, OrderCancelled |
| 支付 | Payment | paymentId, orderId, amount, channel, status | PaymentSucceeded, PaymentFailed |
| 账户 | Account | accountId, userId, availableBalance, frozenBalance | AccountDebited, AccountCredited |
| 结算 | Settlement | settlementId, paymentId, amount, status | SettlementCompleted, SettlementFailed |
| 风控 | RiskRule | ruleId, ruleType, ruleConfig, isActive | RiskEventTriggered |