背景:
在金融信贷流程中,涉及到调多个下游接口需要保证原子性的操作,例如调支付系统提交放款请求、调账务接口记账(记录用户的放款时间、金额、期数、还款计划等),调优惠券系统完成核销、调契约服务生成借据协议。其中对于销券操作、调支付系统的放款操作、调账务接口的记账操作,需要保证强一致性,对于生成借据协议,可以保证最终一致性。
挑战点:
- 资金闭环的实时平衡要求
销券涉及实际资金支出(如优惠券抵扣金额),放款是资金从平台账户转出,记账需确保资金流向精确记录。三者构成完整的资金流:
平台支出=销券金额+实际放款金额借款人资金=实际放款金额
- 任意操作失败将导致:
- ▶️ 销券成功但放款失败 → 平台资金损失(多核销无放款)
- ▶️ 放款成功但记账失败 → 资金流向不明(违反金融审计要求)
- ▶️ 记账成功但销券失败 → 财务数据失真(虚增平台支出)
金融合规性强制要求
- 监管机构要求资金操作后立即生成准确的账务快照,延迟记账可能触发反洗钱警报。
- 实时一致性是《支付机构条例》第24条的核心合规项(60s是条隐形红线)。
用户信任与客诉风险
- 用户若发现扣券未到账或到账金额错误,将直接引发重大客诉
- 调账务接口记账失败,记账延迟不满足要求(监管机构(如央行)要求资金操作后立即生成准确的账务快照,延迟记账可能触发反洗钱警报)
方案演进:
V1:硬编码串联流程(初始版本)
业务流程:
销券 → 放款申请 → 记账(严格串行执行)
技术实现:
public void executeV1() {
couponService.useCoupon(); // STEP1: 销券
paymentService.submitLoan(); // STEP2: 放款
accountingService.book(); // STEP3: 记账
}
存在问题:
| 问题点 | 后果 | 风险等级 |
|---|---|---|
| a. 销券成功但放款失败 | 优惠券浪费(用户未获资金但券已核销) | ⚠️ 严重 |
| b. 销券失败即终止流程 | 正常用户因临时故障无法借款(体验受损) | ⚠️ 中危 |
| c. 放款成功但记账延迟 | 违反央行《支付结算合规指引》要求(资金变动后60秒内需完成账务记录) | ⚠️ 高危 |
V2:事务日志+异步补偿(优化版本)
技术实现:
优化效果:
-
解决V1问题a:
- 放款失败时触发异步解注销(
couponService.restore())恢复优惠券
- 放款失败时触发异步解注销(
-
解决V1问题b:
- 单步失败不影响其他操作重试(如销券失败仍可尝试放款+记账)
-
部分解决V1问题c:
- 记账失败时通过异步重试实现最终一致
遗留问题:
| 问题点 | 原因 | 风险等级 |
|---|---|---|
| 1. 解注销可能失败 | 优惠券系统故障时无法恢复券状态 | ⚠️ 中危 |
| 2. 记账延迟仍超监管阈值 | 异步重试间隔(如5分钟)>央行要求的60秒 | ⚠️ 高危 |
V3:预操作+实时确认(终极方案)
架构升级:
关键创新:
-
双预操作
- 锁券:冻结优惠券(非真实核销)
- 预记账:草稿态记录(不参与资金核算)
-
实时生效
- 调放款接口失败,增加重试机制,达到重试阈值后,回滚券和预记账。
- 放款回调后,若是成功态,同步执行销券确认与记账生效(满足60秒监管要求)。
- 放款失败后,若是失败态,走回滚券和预记账逻辑。
V3 vs V2 优势对比:
| 能力 | V2(补偿模式) | V3(预操作模式) |
|---|---|---|
| 优惠券安全性 | 依赖解注销接口可靠性 | 状态机维护 |
| 记账实时性 | 延迟重试(超监管阈值) | 实时生效(<200ms) |
| 资金流断裂风险 | 存在(异步补偿滞后) | 滞后风险较低 |
| 第三方依赖 | 需逆向接口支持 | 仅需标准状态变更接口 |
演进路径总结
| 版本 | 核心技术 | 解决的核心问题 | 适用场景 |
|---|---|---|---|
| V1 | 硬编码串行 | 基础流程打通 | 非资金类操作 |
| V2 | 事务日志+异步补偿 | 资损恢复(解注销) | 容忍分钟级延迟的资金操作 |
| V3 | 预操作+实时状态机 | 实时一致性+零资损回滚 | 强监管金融场景(支付/信贷核心) |
监控指标
| 指标 | 预警阈值 |
|---|---|
| 记账延迟(V2) | >45秒 |
| 锁券未确认率(V3) | >1%(按小时) |
| 支付回调超时率 | >0.5% |
通过V3方案,可同时满足 “业务零资损” (锁券代替销券)、 “监管合规” (记账实时生效)、 “用户体验” (无感知状态转换)三大目标。
总结:
V3看起来更像是TCC的金融场景特化版,原因如下:
-
核心思想继承
-
保留TCC的
Try-Confirm-Cancel三阶段原子控制,解决分布式事务的隔离性问题。 -
关键创新突破
- 外部事件驱动:用支付回调替代协调器调用,提升可靠性
- 金融状态机:LOCKED/PENDING等状态满足监管审计要求
- 无逆向接口依赖:Cancel阶段通过状态反转实现(无需第三方逆向API)