当前位置: 首页 > news >正文

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

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

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

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

数据库表

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

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

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

账户主要结构:

字段:总余额、业务冻结额、可用余额,

总余额=业务冻结额+可用余额。

账户纳管后,来账资金都会被冻结到业务冻结额中,属于被监管资金。

概要业务逻辑:

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

2) 调用资金解冻接口,解冻付款账户资金(支付金额)。(资金从业务冻结额释放到可用余额中)

3)调用资金转账接口,发起转账。(从账号可用余额中转账)

4)支付结果处理:接口返回成功/失败/其他,则更新支付状态=成功/失败/不确定

5)如果最终支付失败(终态),调用资金冻结接口重新冻结资金。(资金从可用余额冻结到业务冻结额中)

支付简化伪代码

1)幂等控制方法 分布式锁(可选) 检查支付状态=待处理 插入支付执行防重表(保障一笔支付申请至多执行一次付款) 版本号做为条件,CAS更新支付流水表支付状态=处理中,执行时间=? //CAS为比较交换操作,保证并发原子性,执行sql后判断影响行数不等于1则抛异常 //所有更新操作版本号默认+1 2)业务检查方法 try{ 业务检查 }catch(e){ 更新支付流水表支付状态=失败,失败原因=? throw e; } 3)付款账户资金解冻方法 try{ 版本号CAS更新支付流水表解冻状态=处理中,解冻流水号=? 记录冻结解冻记录表 调用资金解冻接口解冻资金(待支付金额)。 如果返回成功,更新支付流水表解冻状态为成功。 如果返回失败,更新支付状态设置为失败,解冻状态为失败,return。 如果返回其他(可能是处理中/不确定/超时等),抛异常。 }catch(e){ 支付状态更新为失败,解冻状态更新为不确定。 【异步补偿定时任务,通过执行结果查询接口查询解冻结果】 throw e; } 4)账户转账方法 try{ 调用转账接口。 如果返回成功,更新支付状态为成功。 如果返回失败,更新支付状态设置为失败,执行冻结冲正方法。 如果返回其他,抛异常。 }catch(e){ 更新支付流水表支付状态=不确定 【异步补偿定时任务,通过转账结果查询接口查询结果】 throw e; }

冻结冲正简化伪代码

try{ 查询是否解冻成功 版本号CAS更新支付流水表冻结状态=处理中,冻结流水号=? where 冻结状态 in (待处理/失败) //所有更新操作版本号默认+1 记录冻结解冻记录表 调用资金冻结接口冻结资金(支付金额)。 如果返回成功,更新支付流水表冻结状态为成功。 如果返回失败,冻结状态为失败,return。【对于冻结冲正失败的会有异步定时任务做补偿重试/短信告警】 如果返回其他(可能是处理中/不确定/超时等),抛异常。 }catch(e){ 冻结状态更新为不确定。 【异步补偿定时任务,通过执行结果查询接口查询冻结结果,更新冻结状态】 }

补偿定时任务(异步化)

核心补偿场景1:资金解冻成功,但是付款失败/没执行付款

# 支付状态=不确定。查询支付结果更新支付状态,并更新。 # 解冻状态=不确定。查询解冻结果更新解冻状态,并更新。 # 冻结状态=不确定。查询冻结结果更新冻结状态,并更新。 # 冻结状态=处理中,执行时间>1小时。查询冻结结果更新冻结状态,并更新。 # 冻结状态=失败。重试或短信告警人工处理。 # 解冻状态=成功,支付状态=失败,冻结状态=待处理。做冻结冲正处理,重新冻结账户资金。 # 支付状态=处理中,执行时间>10分钟。按照支付状态、解冻状态不同情况,做逐一处理。调用各查询接口确定下游系统执行状态

监控定时任务(异步化)

定时检查账户金额,如果可用余额>分行设置的阈值,则报警。

http://www.jsqmd.com/news/1263166/

相关文章:

  • 终极暗黑破坏神2现代化指南:D2DX如何让你的经典游戏焕发新生
  • AI报警系统上线即崩?资深架构师凌晨三点手写排查清单(含Prometheus埋点模板、Kafka积压诊断命令、GPU显存泄漏定位法)
  • 河源古钱币回收哪里靠谱?2026本地正规门店推荐+收藏避坑指南 - 金奢汇
  • OmniVideo-R1:音视频深度融合的跨模态AI理解系统
  • Adrenaline vs Relay:为什么中小型项目更适合选择这款轻量级框架?
  • GEO-AI获客源头服务商重点推荐:南京微尚信息技术有限公司 - 速递信息
  • League Akari:3大核心功能重塑你的英雄联盟游戏体验
  • Java 转大模型开发:代码跑通了,权限却漏了?
  • AI大模型就业:从上线前检查开始讲
  • sysctl 设置随机端口 排除 指定的端口范围等
  • DevEco Code 让 AI 写 ArkTS,ForEach 漏 key、@State 不刷新、满屏 any:我立了 3 条冷门规矩治它
  • 揭秘BioEmu核心技术:DiG架构如何实现热力学系综的精准模拟?
  • 基于深度学习的交通标志识别系统开发实践
  • Jellium Desktop低光模式设置:夜间观看的护眼配置
  • AI模型评估体系构建与工程实践指南
  • 如何在5分钟内用AI智能背景移除插件打造专业直播画面
  • 大语言模型与Agentic AI在智能电网中的架构设计与应用实践
  • Azure Stack Hub 部署准备:DNS / 终结点 / Public IP / 边缘拓扑 / 身份 / Readiness / NTP
  • 如何轻松使用文件指纹技术:秒传链接提取脚本实用高效指南
  • 2026亲测:抖音去水印不留痕迹,高清视频图片一键保存教程 - 爱上科技热点
  • jsonpath-ng性能优化:提升大规模JSON数据查询效率的5个技巧
  • 揭秘Data-Science-Projects-with-Python项目结构:Lesson01到Lesson06学习路径规划
  • 蓝速 AI 双屏翻译机:还原自然对话节奏实操指南
  • GEO技术解析|AI搜索时代,企业官网正在从“展示窗口”变成“AI信源节点” - 速递信息
  • 2026年AI大模型求职必备:Claude Code到Dify的完整工具链实战指南
  • 终极指南:Mappedbus入门到精通,从安装到高并发消息传递实战
  • 服务器2026/2/24
  • Linux运维工程师从零到一:核心技能与实战路径全解析
  • 蓝速科技会议预约屏系统升级落地指南
  • 2026年本科毕业论文软件避雷针:深度实测学范文等五家平台,选对工具毕业无忧