一次因MQ先发后置状况导致的线上故障

本文分析了一次因MQ消息先于同步响应到达,导致支付平台支付状态更新错乱的线上故障。详细阐述了正常执行序列与异常情况下的执行顺序,并提出了两种改进措施:一是分开更新PayNo和Status字段,二是仅记录日志,依赖MQ数据进行更新,同时增强补偿机制以确保幂等性。
摘要由CSDN通过智能技术生成

背景

某支付平台XXX-Pay支持组合支付,XXX-Channel是其中的一条支付渠道。该支付渠道提供的冻结服务接口时,在调用的时候同步返回PayNo,而业务执行结果,通过异步回调的方式实现。

正常执行序列


调用支付服务冻结接口

请求中待{Source,ReqId,FrozenAmount}

落地支付请求,生成PayNo

以Source和ReqId做唯一键约束,落地支付冻结请求,并生成唯一的PayNo。

同步返回PayNo支付冻结号

将PayNo同步返回给调用方

更新支付冻结号PayNo
调用方将PayNo落地到本地,并和ReqId关联起来。

使用的方式是字段全更新的方式.

//得到DTO
select * from request where id = 1;
requestDTO.setPayNo(233);
update request set reqId=#reqId#, payNo=#payNo# where id = 1;
异步完成支付

XXX-Channel异步线程完成支付(内部补偿机制,保证支付过程要么成功,要么失败,不存在中间状态)。

支付结果异步MQ通
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值