首页 > 编程语言 >【不靠谱程序员】接收到回调通知的异步处理

【不靠谱程序员】接收到回调通知的异步处理

时间:2023-10-01 18:22:59浏览次数:41  
标签:异步 不靠 商户 系统 程序员 付款 付款单 order

​支付系统中,像资金下发这种业务,通常是在我们系统发给第三方支付通道后,第三方支付通道会进行资金业务处理。然后,付款完成后,会主动发起回调,即,调用我们系统API,将付款结果通知给我们系统。

假定我们的支付系统对三方通道回调通知的处理逻辑包括:① 修改本地付款单的付款状态;② 将付款结果调用商户系统API,通知给商户。见下方示意图。

 

 

用伪代码来表示,大概是下面这样子:

public void payNotify(Order order) {
    // ① 修改付款单状态
    orderRepository.updatePayResult(order.getId(), "PAY_SUCCESS");
    
    // ② 将付款结果调用商户系统API,通知商户
    Merchant merchant = merchantRepository.getById(order.getMerId());
    String reqMsg = encrypt("orderNo="+order.getOrderId()+"&state=PAY_SUCCESS");
    HttpClient.sendPost(merchant.getNotifyUrl(), reqMsg);
}

 

 

为了提高程序性能,开发人使用了异步线程,出现了下面的不靠谱代码:

public void payNotify(Order order) {
    // ① 修改付款单状态
    new Thread(()->{
        orderRepository.updatePayResult(order.getId(), "PAY_SUCCESS");
    }).start();
    
    // ② 将付款结果调用商户系统API,通知商户
    new Thread(()->{
        Merchant merchant = merchantRepository.getById(order.getMerId());
        String reqMsg = encrypt("orderNo="+order.getOrderId()+"&state=PAY_SUCCESS");
        HttpClient.sendPost(merchant.getNotifyUrl(), reqMsg);
    }).start();
}

 

 

结果呢,出现了一种情况,当前系统里订单的付款状态没能修改,可是通知商户却成功了。。

 

我们作为支付服务提供方,我们系统里的付款单不是终态,而商户系统里却是终态。在支付系统中,这样的程序是很要命的。尤其是当我们系统里的付款单是“付款中”而商户系统里是“付款失败”的情况。这时,商户系统可能会因为付款失败而重新发起付款。如果原单实际是付款成功的话,这就出现了资金风险,即,一笔订单付款了两次。就问你怕不怕?

 

所以,本案中,修改付款单状态的逻辑,必须在主线程执行,确保当前支付系统的付款单状态变更完成后,才可以做后续业务处理。通知商户则可以异步处理,即使通知失败也可以用相关方式来补偿。

 

这个案例告诉我们,代码中在使用JUC、消息队列、回调函数、消息中间件等提高程序性能的方式进行异步处理时,一定要分清主次,哪些逻辑必须在主线程执行,哪些逻辑可以异步处理。

标签:异步,不靠,商户,系统,程序员,付款,付款单,order
From: https://www.cnblogs.com/buguge/p/17739088.html

相关文章

  • springboot 与异步任务,定时任务,邮件任务
    异步任务在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring3.x之后,就已经内置了@Async来完美解决这个问题。SpringBoot实现比较简单主启动类:添加注释......
  • 读后感:《程序员修炼之道》第二部分 - 以实践为中心
    第二部分的《程序员修炼之道》为我打开了一扇通向更高质量代码编写的大门。它强调了编程实践的重要性,提供了一系列关于代码质量、可维护性和效率的宝贵建议。以下是我从这一部分中得到的主要启示:首先,书中详细讨论了代码的可读性。作者指出,代码应该对人类友好,易于理解。清晰的变量......
  • 9月《程序员修炼之道:从小工到专家》阅读笔记(2)
    三、基本工具14纯文本的威力纯文本可以获得自描述的,不依赖于创建他的应用的数据流。纯文本可以保证不过时,更容易测试等。15shell游戏对程序员来说,工作台就是命令shell。GUI无法让我们超越设计者提供的模型,而我们往往需要这种操作,这时候shell就是你最顺手的工具。16强力编辑......
  • 前端 | React setState 同步异步以及处理方式 | React
    前端|ReactsetState同步异步以及处理方式|React问题描述在同步执行流程中setState表现为异步,而在异步执行流程中setState表现为同步。示例:有一个控制DOM节点显隐的状态值,默认为false,而下一步就需要获取该DOM节点做一系类处理。所以一开始使用setState设置状态值为true,让该......
  • Flutter/Dart第04天:Dart异步编程(Future和async/await)
    Dart官网代码实验室:https://dart.dev/codelabs/async-await重要说明:本博客基于Dart官网代码实验室,但并不是简单的对官网文章进行翻译,我会根据个人研发经验,在覆盖官网文章核心内容情况下,加入自己的一些扩展问题和问题演示和总结,包括名称解释、使用场景说明、代码样例覆盖、最后完......
  • 《程序员修炼之道:从小工到专家》第一第二章读书笔记
    第一章:追求实效的哲学第一节:我的源码被猫吃了在开发过程中,我们经常会遇到一些意想不到的技术问题,导致交付延迟等情况。然而,作为程序员,我们需要诚实和坦率地面对这些问题,并勇于承认自己的错误。我们应该以专业的态度处理这些问题,而不是找借口。此外,我们要对自己承担的责任负责。......
  • 读后感:《程序员修炼之道》第一部分 - 哲学
    第一部分的《程序员修炼之道》引领我进入了一场关于编程哲学的探索之旅。它不仅仅是一本技术书籍,更是一本关于如何成为优秀程序员的指南。以下是我的一些主要印象和感悟:首先,书中明确了作为程序员的责任感。作者们告诉我们,我们不仅仅是代码的书写者,还是问题的解决者。我们需要理解......
  • 9月《程序员修炼之道:从小工到专家》阅读笔记
    一、注重实效的哲学1我的源码让猫吃了无论是什么任务,我们都可能出现错误,这时,我们需要尽可能处理好他们以示诚实坦率。我们必须承担责任,一味的推卸责任毫无用处。要找各种选择,而非借口。2软件的熵熵在软件中代表“软件腐烂”。究其原因,最重要为开发项目时的心理/文化。那么为什......
  • 《程序员修炼之道:从小工到专家》读后感九月篇一
    第一章主要讲了程序员修炼的哲学基础,包括注重实效、勇于承认错误和不断学习等。这些内容对我有很大的启示和帮助,让我更加明白了程序员成长之路上的方向和目标。一开始作者强调了注重实效的哲学。程序员在工作中会遇到各种挑战和困难,这种情况下,勇敢地承认错误,并不断尝试原型、测试......
  • 《程序员修炼之道:从小工到专家》读后感九月篇二
    《程序员修炼之道:从小工到专家》的第二章主要讲述了重复的危害和解决重复问题的关键。对于一名程序员来说,重复是不可避免的现象,但过多的重复不仅会降低代码的运行效率,也会给代码的维护带来很多麻烦。因此,解决重复问题对于提高代码质量和效率至关重要。作者对重复的危害进行了详细......