背景

重构是通过新增领域事件来实现的:
支付域重构兼容性分析方法论 - 图1

兼容性/幂等分析

  1. 发布中兼容性(新老机器、新老代码兼容性)
  2. 新代码对老单据的兼容性(幂等分析)
  3. 正向支付、逆向退款的兼容性

发布中兼容性

兼容性分析

支付事件驱动框架,事件的执行被分为四个阶段,每个阶段可能因为一些系统异常(rpc超时等等)而中断执行,然后通过云资金的异步命令被拉起。
支付域重构兼容性分析方法论 - 图2

所以就有了以下发布中的兼容性问题:执行中断的事件,在不同代码的机器上被拉起时,能否正常被执行:

  1. 新代码创建的交易是否可以由老代码兼容执行完
  2. 老代码创建的交易是否可以由新代码兼容执行完

支付域重构兼容性分析方法论 - 图3

解法

在入口层用切流开关做新老代码的隔离,开关关闭的情况下,所有流量都走老逻辑,然后把新代码全部部署到线上后,逐步用切流开关做灰度。
支付域重构兼容性分析方法论 - 图4
支付域重构兼容性分析方法论 - 图5

幂等兼容性

兼容性分析

老单据走新事件

支付域重构兼容性分析方法论 - 图6

新单据走老事件

支付域重构兼容性分析方法论 - 图7

解法

关键点:

  1. 新老操作的对同一笔outTradeNo落库时,唯一键保持不变
    1. isvOrgId + outTradeNo + operateType
    2. 所以需要 OperateType 保持不变
  2. 保证新老单据,能重入新老事件的处理流程

    1. 能走到Save就行,走到save就会进入幂等的逻辑
    2. 具体幂等的逻辑,详见Manager切面——很重要,代码要反复学习

      关联交易兼容性

      背景:
  3. 老的退款事件不支持部分退款

  4. 新的退款事件支持部分退款

    兼容性分析

    支付域重构兼容性分析方法论 - 图8

解法

整体思路

  1. 新支付事件生成的支付单一定走新的退款事件
  2. 老支付事件生成的支付单,也要支持走新的退款事件
    1. 才能实现所有支付单都能支持部分退款