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 子域协作关系与领域事件流

下图展示了五个核心子域之间的典型协作流程,以一次成功的支付交易为例:

支付订单核心子域协作流程图 支付订单核心子域协作流程图 订单子域 Order 聚合根 支付子域 Payment 聚合根 账户子域 Account 聚合根 结算子域 Settlement 聚合根 风控子域 RiskRule 聚合根 OrderCreated 风险评估请求 风险通过 PaymentSucceeded 资金划转指令 SettlementCompleted 协作说明: 1. 订单创建后发布 OrderCreated 事件,触发支付子域发起支付。 2. 支付子域在发起支付前调用风控子域进行风险评估,通过后继续执行。 3. 支付成功后,支付子域发布 PaymentSucceeded 事件,结算子域执行资金划转并通知订单子域。
关键设计要点:领域事件是子域解耦的核心。订单子域无需知道支付子域的具体实现,只需监听 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