支付系统保证可靠性的秘诀 ----- 订单的补偿和补单
文章目录
- WHAT? 前言
- WHY? 为什么要补偿、补单?
- HOW 如何实现补偿补单?
- 1.基础设计
- 唯一订单号和幂等性:
- 异常机制:
- 订单查询机制:
- 2.具体实现方式
- 定时任务调度:
- mq延时消息:
- 总结
WHAT? 前言
- 刚入职场的时候觉得支付宝等第三方支付系统好强大,要保证这么多的交易不能错,也不能重复还要保证正确的扣钱,直到后面接触订单系统以及第三方支付公司的核心交易系统后才真正窥探到了支付系统的核心设计理念和架构,虽然不同公司细节上会有一些区别,但是总体的设计思路基本都是一致的,这篇文章主要是讲“补偿、补单在支付系统的上的应用以及如何提升可用性”。
WHY? 为什么要补偿、补单?
我们这里先简要的解释下何为“补偿”、“补单”:
正常情况下我们的订单系统发起支付调用支付接口,支付接口同步返回订单支付成功或者失败或者处理中,但是由于系统暴露在网络下,网络的不稳定势必会出现以下几种可能:
第一种情况:订单系统调用支付接口网络超时或者断联
这种情况下就会出现订单系统订单已经生成,而且是处理中,但是支付系统压根没有订单,这个时候该,我们可以重新发起支付请求,让支付系统也有对应的订单,这个就是所谓的“补单”(后面会介绍如何做)第二种情况: 支付系统同步返回订单系统时网络超时或者断联
这种情况订单系统和支付系统都已经生成对应的订单,但是由于支付系统同步返回网联问题导致支付系统无法感知订单是否成功,这个时候就需要一个机制去再次确认订单的状态,这个就是所谓的“补偿”
HOW 如何实现补偿补单?
接下来我们用两个维度去设计实现补单补偿机制
- 基础设计
- 具体实现方式
1.基础设计
唯一订单号和幂等性:
唯一订单号和幂等性应该是订单系统和支付系统的基础,想象一下如果有两笔同样订单号的订单支付两次那就会产生严重的后果,所以不管是订单系统还是支付系统,第一个需要保证的就是订单的唯一性和幂等,也就是同一个订单号进入支付系统,需要返回已存在而不是直接插入数据库(幂等不了解可以搜一下这里不展开讲)。
异常机制:
异常机制是业务订单系统需要考虑的开发设计点,想象一下一个订单请求后超时报错,和一个订单业务的报错,我们如果都处理为失败合理吗?所以在“网络超时等系统级别的异常”我们不需要对订单进行状态的操作,而是将订单标记一下或者不需要标记等待订单的补偿,而“订单业务的失败”如:余额不足、账户异常等业务异常则需要根据业务单独处理,并记录错误的原因方便查看。
订单查询机制:
订单查询的机制是支付系统进行补单和补偿比较核心的一环,支付系统需要对外提供查询接口,让调用方能够知道订单的状态,以及订单是否存在,方便进行补单和补偿的操作,注意的是在设计订单的补偿和补单时需要考虑支付系统落单的时间差(调用支付系统后瞬间做出订单查询接口会返回订单不存在的风险)
补偿: 调用查询接口查到订单,如果为成功则更新订单为终态结束流程
补单: 如果发现订单不存在,则需要再次调用支付接口完成补单(原来的订单号)
2.具体实现方式
定时任务调度:
在实现补偿和补单的业务中,定时任务是一个比较好的实现方案,市面上XXL-job、elastic-job都是比较成熟而且应用到生产的第三方定时任务解决方案,
业务实现上:可以用两个job。
一个去定时查订单表中处理中的订单,然后调用查询接口去查订单是否已经成功,如果成功测更新,不成功就等待下次定时任务。
第二个job去查处理中的订单是否存在,不存在则走补单逻辑。
mq延时消息:
类似rocketmq有延时消息的功能,具体就是在消息发送的时候设置一个延后发送的等级,消息会在一段时间后发送而不是即时发送(具体rocketmq延时消息方面文章很多这里不展开),这恰好可以做订单的补偿逻辑,具体实现:
以rocketmq默认补偿的级别是:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h (16个级别)
1.自定义补偿间隔,一个自定义补偿间隔 如 5s,30s,1m,2m,2m,4m,4m,5m,2m,5m,5m,30m,1h,2h,,每次接到消息以后如果做订单查询还是处理中则将补偿次数+1,通过自定义的补偿时间去反查rocketmq的的补偿等级做到自定义补偿时间间隔。
2.设置最大补偿次数 我们可以自定义一个最大补偿次数如30次,这样尝过我们自定义补偿间隔后都会以最后一个延时消息间隔时间进行补偿,直到30次。
总结
本文介绍了支付系统的高可用性核心的实现方式:订单的补偿和补单以及实现方式,是一个非常好的思维方式,可以运用到许多的系统和业务中,具体实现方式各家有不同,但是思想大致是一致的,希望对你有所启发,有任何疑惑可以私信我。
支付系统保证可靠性的秘诀 ----- 订单的补偿和补单相关推荐
- 《支付系统-3交易系统》
本文属于ping++<支付系统>白皮书读书笔记系列. 3. 1收单网关 收单网关主要负责吧业务系统的请求转化为支付系统的内部请求,主要是进行参数校验.权限检查等再对支付系统进行转发. 这里 ...
- 微信、支付宝等个人免签支付系统原理与实现
以前一直只知道如果要接入微信支付.支付宝支付这些自动回调的支付系统,都需要有企业资质之类签约审核的,个体是无法接入的.个人的收款码只能是手动收款,人工处理收款后续操作,在系统和应用中无法做到实时回调. ...
- 每秒处理10万高并发订单支付系统架构
一.库分表 在redis,memcached等缓存系统盛行的互联网时代,构建一个支撑每秒十万只读的系统并不复杂,无非是通过一致性哈希扩展缓存节点,水平扩展web服务器等.支付系统要处理每秒十万笔订单, ...
- 每秒处理10万高并发订单的乐视集团支付系统架构分享【转】
转自:https://www.cnblogs.com/hackxhao/p/5496254.html 随着乐视硬件抢购的不断升级,乐视集团支付面临的请求压力百倍乃至千倍的暴增.作为商品购买的最后一环, ...
- 支付系统 “订单模型” 该如何设计?
导读 最近经历了一件事,就是小码农所在的公司因为被某大厂收购之后要进行融合了,其他方面的融合就没必要说了,今天咱们只是聊一下支付系统融合的事情.首先从很多互联网公司的发展经验来看,随着多条业务线的发展 ...
- 支付系统中订单redis防重的使用
支付系统中订单redis防重的使用
- 微信,支付宝,收款二维码实时生成订单监控,免签支,付支付系统,个人收款,收款二维码...
微信,支付宝,收款二维码实时生成订单监控,免签支,付支付系统,个人收款,收款二维码 微信和支付宝个人支付二维码生成与监控!有PHP接口回调,个人收款好助手! 实现收款即时到个人微信或支付宝账户!方便安 ...
- 浅议网上支付系统关键技术探究
[论文摘要:电子商务 网上支付系统 技术策略 [论文摘要我国电子商务和网上交易近年来取得了较大的发展 ,然而网上支付成为我国电子商务发展的瓶颈之一.因此 ,解决网上支付新问题是发展电子商务的必要环节. ...
- 一款实用可行的支付系统,专供互联网企业使用,赶紧收藏了!
前两天有小伙伴来找小编,问哪里有互联网企业用的支付系统,想学习学习提升提升. 小伙伴的要求,小编自然是放在第一位去实现的,这几天废寝忘食的搜寻,终于找到一款不错的开源支付系统,赶紧来和大家分享! Je ...
最新文章
- 【FFmpeg】AVOutputFormat/AVInputFormat 成员变量 flags 总结
- 我常用的那些linux命令
- python 逆向生成正则表达式_用Python中的正则表达式生成lis
- 四川大学计算机学硕分数线,川大计算机考研分数线
- php使用 memcache 来存储 session
- svn回退到上一个版本_Git汇总--对象及版本库存储
- Centos 7 学习加入用户
- springmvc获取原生servletAPI
- 交叉编译 openwrt 平台上的开源 H3C iNode 客户端 njit-client
- 江西师大计算机系周洁,江西师大2005年学习之星申报者汇总表-江西师范大学教务在线.DOC...
- 计算机在档案管理出现的问题,浅议档案管理中存在的问题及解决措施_档案管理员资格证...
- 很全的路由器默认初始密码集合.txt_为何小企业要用企业级无线路由器?一次对比选购经历证实...
- mysql workbench 安全模式_MySQL Workbench的安全模式解决
- 最新电影《D战》幕后真实案件:暗夜黑客组织被端
- 查询大数据各组件版本
- PostgreSQL数据库统计信息——analyze执行函数
- 网易云亮相GITC,聚合多样化通信与视频云平台
- 通过python修改cmd路径_cmd中如何更改文件路径 - 卡饭网
- 全球133种语言自动翻译mishop大米外贸商城系统
- (Linux)配置本地yum源
热门文章
- 好未来赚数倍,大跌前又精准提前离场:高瓴张磊的核心投资方法论到底是什么?
- 如何使用SPSS进行相关性和回归分析
- Java编程思想读书笔记——多态
- 【gulimall】com.alibaba.nacos.api.exception.NacosException: java.lang.reflect.InvocationTargetExcepti
- 【Jmeter】安装配置:Jmeter 自定义创建桌面快捷方式
- 小度智能音箱2红外版测评和拆机
- Labview视觉一键尺寸测量仪,多产品,多尺寸,快速编辑, 测量,导出结果
- PHP判断电脑端和手机端
- java求二维数组每行元素的和
- 联发科MTK手机线刷错误代码信息解译以及解决方法大全