【个人沉淀】金融信贷流程中跨服务操作原子性保障方案

0 阅读5分钟

背景:

在金融信贷流程中,涉及到调多个下游接口需要保证原子性的操作,例如调支付系统提交放款请求、调账务接口记账(记录用户的放款时间、金额、期数、还款计划等),调优惠券系统完成核销、调契约服务生成借据协议。其中对于销券操作、调支付系统的放款操作、调账务接口的记账操作,需要保证强一致性,对于生成借据协议,可以保证最终一致性。

挑战点:

  • 资金闭环的实时平衡要求

销券涉及实际资金支出(如优惠券抵扣金额),放款是资金从平台账户转出,记账需确保资金流向精确记录。三者构成完整的资金流:

平台支出=销券金额+实际放款金额借款人资金=实际放款金额

  • 任意操作失败将导致
  • ▶️ 销券成功但放款失败 → 平台资金损失(多核销无放款)
  • ▶️ 放款成功但记账失败 → 资金流向不明(违反金融审计要求)
  • ▶️ 记账成功但销券失败 → 财务数据失真(虚增平台支出)

金融合规性强制要求

  • 监管机构要求资金操作后立即生成准确的账务快照,延迟记账可能触发反洗钱警报。
  • 实时一致性是《支付机构条例》第24条的核心合规项(60s是条隐形红线)。

用户信任与客诉风险

  • 用户若发现扣券未到账或到账金额错误,将直接引发重大客诉
  • 调账务接口记账失败,记账延迟不满足要求(监管机构(如央行)要求资金操作后立即生成准确的账务快照,延迟记账可能触发反洗钱警报)

方案演进:

V1:硬编码串联流程(初始版本)

业务流程

销券 → 放款申请 → 记账(严格串行执行)

技术实现

public void executeV1() {
    couponService.useCoupon();  // STEP1: 销券
    paymentService.submitLoan(); // STEP2: 放款
    accountingService.book();   // STEP3: 记账
}

存在问题

问题点后果风险等级
a. 销券成功但放款失败优惠券浪费(用户未获资金但券已核销)⚠️ 严重
b. 销券失败即终止流程正常用户因临时故障无法借款(体验受损)⚠️ 中危
c. 放款成功但记账延迟违反央行《支付结算合规指引》要求(资金变动后60秒内需完成账务记录)⚠️ 高危

V2:事务日志+异步补偿(优化版本)

技术实现

image.png

优化效果

  1. 解决V1问题a

    1. 放款失败时触发异步解注销(couponService.restore())恢复优惠券
  2. 解决V1问题b

    1. 单步失败不影响其他操作重试(如销券失败仍可尝试放款+记账)
  3. 部分解决V1问题c

    1. 记账失败时通过异步重试实现最终一致

遗留问题

问题点原因风险等级
1. 解注销可能失败优惠券系统故障时无法恢复券状态⚠️ 中危
2. 记账延迟仍超监管阈值异步重试间隔(如5分钟)>央行要求的60秒⚠️ 高危

V3:预操作+实时确认(终极方案)

架构升级

image.png

关键创新

  1. 双预操作

    1. 锁券:冻结优惠券(非真实核销)
    2. 预记账:草稿态记录(不参与资金核算)
  2. 实时生效

    1. 调放款接口失败,增加重试机制,达到重试阈值后,回滚券和预记账。
    2. 放款回调后,若是成功态,同步执行销券确认与记账生效(满足60秒监管要求)。
    3. 放款失败后,若是失败态,走回滚券和预记账逻辑。

V3 vs V2 优势对比

能力​V2(补偿模式)V3(预操作模式)
优惠券安全性依赖解注销接口可靠性状态机维护
记账实时性延迟重试(超监管阈值)实时生效(<200ms)
资金流断裂风险存在(异步补偿滞后)滞后风险较低
第三方依赖需逆向接口支持仅需标准状态变更接口

演进路径总结

版本​核心技术​解决的核心问题​适用场景​
V1硬编码串行基础流程打通非资金类操作
V2事务日志+异步补偿资损恢复(解注销)容忍分钟级延迟的资金操作
V3预操作+实时状态机实时一致性+零资损回滚强监管金融场景(支付/信贷核心)

监控指标

指标​预警阈值
记账延迟(V2)>45秒
锁券未确认率(V3)>1%(按小时)
支付回调超时率>0.5%

通过V3方案,可同时满足 “业务零资损” (锁券代替销券)、 “监管合规” (记账实时生效)、 “用户体验” (无感知状态转换)三大目标。

总结:

V3看起来更像是TCC的金融场景特化版,原因如下:

  1. 核心思想继承

  2. 保留TCC的Try-Confirm-Cancel三阶段原子控制,解决分布式事务的隔离性问题。

  3. 关键创新突破

    1. 外部事件驱动:用支付回调替代协调器调用,提升可靠性
    2. 金融状态机:LOCKED/PENDING等状态满足监管审计要求
    3. 无逆向接口依赖:Cancel阶段通过状态反转实现(无需第三方逆向API)