WHAT? 前言

刚入职场的时候觉得支付宝等第三方支付系统好强大,要保证这么多的交易不能错,也不能重复还要保证正确的扣钱,直到后面接触订单系统以及第三方支付公司的核心交易系统后才真正窥探到了支付系统的核心设计理念和架构,虽然不同公司细节上会有一些区别,但是总体的设计思路基本都是一致的,这篇文章主要是讲“补偿、补单在支付系统的上的应用以及如何提升可用性”。

WHY? 为什么要补偿、补单?

我们这里先简要的解释下何为“补偿”、“补单”:
image.png

正常情况下我们的订单系统发起支付调用支付接口,支付接口同步返回订单支付成功或者失败或者处理中,但是由于系统暴露在网络下,网络的不稳定势必会出现以下几种可能

  • 第一种情况:订单系统调用支付接口网络超时或者断联

这种情况下就会出现订单系统订单已经生成,而且是处理中,但是支付系统压根没有订单,这个时候该,我们可以重新发起支付请求,让支付系统也有对应的订单,这个就是所谓的“补单”(后面会介绍如何做)
支付系统保证可靠性的秘诀 ----- 订单的补偿和补单 - 图2

  • 第二种情况: 支付系统同步返回订单系统时网络超时或者断联

这种情况订单系统和支付系统都已经生成对应的订单,但是由于支付系统同步返回网联问题导致支付系统无法感知订单是否成功,这个时候就需要一个机制去再次确认订单的状态,这个就是所谓的“补偿”
image.png

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次。

总结
本文介绍了支付系统的高可用性核心的实现方式:订单的补偿和补单以及实现方式,是一个非常好的思维方式,可以运用到许多的系统和业务中,具体实现方式各家有不同,但是思想大致是一致的,希望对你有所启发,有任何疑惑可以私信我。
————————————————
版权声明:本文为CSDN博主「superboboge」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/boboaisisi/article/details/120531595