解冻支付功能-分布式数据一致性(分布式事务)

这是一个银行资金监管系统生产中的真实案例,我方资金监管系统A在完成资金支付功能时,下游涉及两个系统。需要先调用系统B的解冻接口完成资金解冻,然后再调用系统C的转账接口完成资金支付。各系统间数据一致性保障,采用类似SAGA事务的思路,如果失败或异常,我方统一负责补偿或冲正处理。

系统B提供:资金解冻接口、资金冻结接口、执行结果查询接口,通过上送唯一流水号保证幂等和查询结果条件。

系统C提供:资金转账接口、转账结果查询接口,通过上送唯一流水号保证幂等和查询结果条件。

数据库表

1)支付流水表(支付流水号,解冻流水号,冻结流水号,支付状态(待处理、处理中、成功、失败、不确定),解冻状态(待处理、处理中、成功、失败、不确定),冻结状态(待处理、处理中、成功、失败、不确定),金额,付款账户,收款账户,交易日期,各种时间,版本号等)

2)冻结解冻记录表(流水号,支付流水号,类型,状态,账号,金额,时间,结果)

3)支付执行防重表(支付流水号唯一约束)

业务大致逻辑是:

1)我方系统A做支付前置校验

  1. 调用资金解冻接口,解冻付款账户资金(支付金额)。

3)调用资金转账接口,转账

支付简化伪代码

java 复制代码
1)幂等控制方法
插入支付执行防重表
版本号CAS更新支付流水表支付状态=处理中
//所有更新操作版本号默认+1

2)业务检查方法
try{
    业务检查
}catch(e){
    更新支付流水表支付状态=失败,失败原因=?
    throw e;
}

3)付款账户资金解冻方法
try{

    版本号CAS更新支付流水表解冻状态=处理中,解冻流水号=?

    记录冻结解冻记录表

    调用资金解冻接口解冻资金(待支付金额)。

    如果返回成功,更新支付流水表解冻状态为成功。

    如果返回失败,更新支付状态设置为失败,解冻状态为失败,return。

    如果返回其他,抛异常。
}catch(e){
    支付状态更新为失败,解冻状态更新为不确定。
    【异步补偿自动任务,通过执行结果查询接口查询解冻结果】
    throw e;
}

4)账户转账方法
try{  

    调用转账接口。

    如果返回成功,更新支付状态为成功。

    如果返回失败,更新支付状态设置为失败,执行冻结冲正方法。

    如果返回其他,抛异常。
}catch(e){
    更新支付流水表支付状态=不确定
    【异步补偿自动任务,通过转账结果查询接口查询结果】
    throw e;
}

冻结冲正简化伪代码

java 复制代码
try{

    版本号CAS更新支付流水表冻结状态=处理中,冻结流水号=? where 冻结状态 in (待处理/失败)

    记录冻结解冻记录表

    调用资金冻结接口冻结资金(支付金额)。

    如果返回成功,更新支付流水表冻结状态为成功。

    如果返回失败,冻结状态为失败,return。【对于冻结冲正失败的会有异步自动任务做补偿重试/短信告警】

    如果返回其他,抛异常。
}catch(e){
    冻结状态更新为不确定。
    【异步补偿自动任务,通过执行结果查询接口查询冻结结果,更新冻结状态】
}
  

补偿自动任务

java 复制代码
1 支付状态=不确定。查询支付结果更新支付状态
2 解冻状态=不确定。查询解冻结果更新解冻状态
3 冻结状态=不确定。查询冻结结果更新冻结状态
4 冻结状态=失败。重试或短信告警人工处理。
5 支付状态=失败,解冻状态=成功。做冻结冲正处理,重新冻结账户资金。
6 支付状态=处理中,交易时间>1小时。按照支付状态、解冻状态不同情况,做逐一处理。优先调用各查询接口确定下游系统执行状态
相关推荐
liulilittle1 小时前
论无知:分布式
服务器·网络·分布式·并发·通信·竞态
脱胎换骨-军哥4 小时前
C++ 与 Go 生成质量比拼,谁是分布式主力语言
c++·分布式·golang
珠***格18 小时前
XGF10-Z-4典型接入方式解析:10千伏专变用户380伏多点分布式光伏如何并网?
网络·人工智能·分布式·安全·边缘计算
阿里云云原生1 天前
Agent 不再是“玩具”!AgentScope Java 2.0 GA 发布:构建企业级分布式智能体底座
java·开发语言·分布式·agentscope
时代的狂1 天前
RabbitMQ 面试问答
分布式·面试·rabbitmq
hkNaruto1 天前
【大数据】《传统Hadoop大数据技术入门:补充与进阶——从数据格式到智能决策的问答实录》
大数据·hadoop·分布式
ThanksGive1 天前
TurboLock:从 v1 Redis 分布式锁到 v2 Go 并发控制中间件
分布式·后端
韩楚风2 天前
【参天引擎】事务生命周期 / MVCC / Undo / ACID / 分布式事务 功能域整体解析
数据库·分布式·mysql·架构·cantian
ACP广源盛139246256732 天前
GSV6155@ACP# 搭配 AI 服务器、AI PC 完整适配方案
大数据·服务器·人工智能·分布式·单片机·嵌入式硬件
ZENERGY-众壹2 天前
50MW分布式VPP接入实战:调度中心要求的1分钟频率如何不卡死API
运维·服务器·分布式·光伏运维