订单支付[通俗易懂]

订单支付[通俗易懂]前言文章中的图片和在摘录不是来自一篇文章,所以细节不是完全对应。可借鉴的是开发的思路:从整体的功能模块的使用; 到核心流程; 到系统实现的架构; 再到代码流程(可以采用序列图)。前两点是业务需求,后两点是功能实现。支付系统的作用https://www.cnblogs.com/veblen/p/10992167.html核心流程http://www….

大家好,又见面了,我是你们的朋友全栈君。

目录

前言

支付系统的作用

核心流程

架构图

代码流程

线程池中处理发送消息到MQ、持久化的数据库

支付成功后,消息分发流程图

​订单作为消费者消费消息

测试



前言

文章中的图片和在摘录不是来自一篇文章,所以细节不是完全对应。可借鉴的是开发的思路:

  1. 从整体的功能模块的使用;
  2. 到核心流程;
  3. 到系统实现的架构;
  4. 再到代码流程(可以采用序列图)。

前两点是业务需求,后两点是功能实现。

支付系统的作用

https://www.cnblogs.com/veblen/p/10992167.html

 

订单支付[通俗易懂]

核心流程

订单支付[通俗易懂]

订单支付[通俗易懂]

http://www.woshipm.com/pd/1392102.html

订单支付:

用户支付完订单后,需要获取订单的支付信息,包括支付流水号、支付时间等。支付完订单接着就是等商家发货,但在发货过程中,根据平台业务模式的不同,可能会涉及到订单的拆分。

架构图

https://blog.csdn.net/egworkspace/article/details/78900438?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

订单支付[通俗易懂]

跟着标注的序号,可以跟踪到一个支付请求是如何发起的(Sequence Diagram就免了),流程描述如下:

  1. Submit a pay task,当客户端需要发起支付的时候,起始是向支付任务队列里面加入了一个新的支付任务,这个过程是异步实现的。先根据客户端提交的参数,构造好一个新的支付任务;
  2. Offer a task,开启一个异步任务,做的事情就是向MQ中添加一个新的支付任务,等待被消费;
  3. Pay task description,一旦异步任务被成功创建,将会把第一步构造好的支付任务信息直接return给客户端;
  4. Poll a task,与此同时,支付任务的消费者将新的支付任务poll下来进行执行;
  5. Send a pay request,这一步需要根据实际情况而定。并不是所有的支付请求都要先经过第三方支付平台,比如支付宝;而对于微信,则还需要凭支付参数申请一个prepay_id,再经由客户端发起支付;
  6. Response,没什么好说的,第三方渠道返回的支付必要参数;
  7. Cache result,至此,一个支付任务可以算是完成了,可以将任务的执行结果(无论成功与否)缓存在Redis中,随时等待客户端的回访;
  8. Query result,客户端在提交支付任务后,间隔一定时间后(建议2~3s),发起一个结果查询的请求;
  9. Query,直接进Redis查找结果;
  10. Synchronize,这是一个异步的操作,将支付任务的执行结果“顺便”同步到MongoDB中,并删除Redis中缓存的任务执行结果。持久化到MongoDB主要是为后续的容错,重试,数据分析等提供落地的数据源;
  11. Return,由Redis返回给应用服务器;
  12. Return payment,应用服务器再将最终的支付对象返回给客户端。

让我们更深入一点,我们来看三张Class Diagram:

① 先说说支付任务(PayTask)部分。PayTask和Payment两个都是MongoDB中的Document对象,但在任务执行期间,PayTask是用Redis进行缓存的,方便客户端随时发起Query,任务执行成功后,会生成Payment对象,最终PayTask和Payment都会持久化到MongoDB中。在PayService中,有对支付任务的一些基本操作,包括任务提交,取消,重试,构建等等。

订单支付[通俗易懂]

② 再说说任务的执行(runner)。这部分和RabbitMQ紧密相关,一旦一个支付任务形成了,就会放入任务执行队列中,由消费者取出执行。在TaskRunner中,有两个基本的接口方法:run(task)、retry(task),分别是执行任务和重试任务。在AbstractPayTaskRunner中已经封装好了这两个方法,继承AbstractPayTaskRunner需要实现doTask方法,从返回值可以看出,这个过程是异步化的。关于Retry机制,用户可以设置重试与否,一旦设置了TaskInfo.needRetry=true(不出意外,默认就是允许重试),就启用了Retry机制。还可以设置重试的次数(TaskInfo.retryTimes),默认三次,分别间隔1s,2s,3s,间隔时间以公差为1的等差数列组成。当然不会让用户无限重试,系统内置有一个最大重试次数,最大重试次数内置为5次。

为什么是5次?

你感受一下,1s,2s,3s,4s,5s,整个请求链条就被拉长到了15s,这对客户端简直就是灾难了!!

订单支付[通俗易懂]

代码流程

创建支付

 

订单支付[通俗易懂]

线程池中处理发送消息到MQ、持久化的数据库

订单支付[通俗易懂]

订单支付[通俗易懂]

支付成功后,消息分发流程图

订单支付[通俗易懂]订单作为消费者消费消息

订单支付[通俗易懂]

测试

在测试程序中调用sendMessage

因为发送消息是在线程池中,当测试程序(主程序)停止运行,线程池也就停止运行,所以,为了让主程序不停止,在方法末尾加上:System.in.read();

System.in.read()可以实现输入字符,返回字符的Unicode码,但是缺点是只能输入一个字符
System.in.read() 返回的是输入数值的 ASKII 码(一个 int 整数)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134795.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • wait(),notify(),notifyAll()_多线程wait和sleep

    wait(),notify(),notifyAll()_多线程wait和sleep前言在上一篇中,我们介绍了Java中的线程的基本概念,我们了解到线程是有很多种状态的,本章,我们就来聊聊线程中的状态是如何进行控制与切换的。Java中提供了很多种方法对线程的状态进行控制以及线程之间的通信,包括wait、notify、notifyAll、sleep,下面我们就来看一下它们之间有什么区别,以及如何使用这些方法进行线程状态的控制与通信。线程之间的通信在Java中可以用w…

    2022年9月8日
    0
  • vue常用命令[通俗易懂]

    vue常用命令[通俗易懂]vue常用命令

    2022年4月22日
    37
  • QT QMap介绍与使用「建议收藏」

    QT QMap介绍与使用「建议收藏」Qt中的QMap介绍与使用,在坛子里逛了一圈,发现在使用QMap中,出现过很多的问题,Map是一个很有用的数据结构。它以“键-值”的形式保存数据。在使用的时候,通过提供字符标示(键)即可得到想要的数据。这个“数据”即可以是一个字符串,也可以是任意对象,当然也包括自己定义的类对象。说明:map是以值传递的形式保存数据的。1.基本应用下面以“键-值”都是QString的例子说明QMa

    2022年5月30日
    61
  • android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用

    android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用因为今天用到了ScaleAnimation缩放动画就写一下,加深一下印象。用ScaleAnimation有几个重载方法,这里就将八个参数的重载方法。ScaleAnimation(floatfromX,floattoX,floatfromY,floattoY,intpivotXType,floatpivotXValue,intpivotYType,floatpivotYV…

    2022年10月16日
    0
  • pycharm中彻底删除一个工程的步骤

    pycharm中彻底删除一个工程的步骤具体出现的问题是,你已经删除的工程反复出现在pycharm里面。解决步骤:1,打开pycharm,点击File——>CloseProjects(有的是CloseProjectsinCurrentWindow);2,然后会出现一个小窗口,左边一列为你的工程项目,选择想删除的项目,点击右上角的叉号;3,最后打开你想删除的工程项目的文件路径,左键点击选中该项目,然后按…

    2022年8月29日
    0
  • 安全帽识别的原理和系统应用

    安全帽识别的原理和系统应用安全帽识别的原理是用AI技术对工作现场的视频进行实时分析,如果发现工作人员未按要求佩戴安全帽或违规吸烟,系统会自动发出警报,在提醒监理人员的同时,系统会自动保存时间、地点及相应的照片,作为处罚的依据,AI大潮之下,传统的建筑工地也有许多方面得到了提升,除了人脸识别之外,智慧工地最关心的就是安全问题,如何将AI技术应用于安全方面呢?鹰眸安全帽识别系统就是这些特殊区域的守护者。可以说,安全帽智能识别是…

    2022年5月12日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号