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

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

时间:2023-11-16 12:05:52浏览次数:397  
标签:异步 不靠 商户 系统 程序员 付款 付款单 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://blog.51cto.com/u_15708799/8415967

相关文章

  • 想快速进入人工智能领域的Java程序员?你准备好了吗?
    引言今天我们来探讨一下作为Java程序员,如何迅速融入人工智能的领域。,当前有一些流行的LLMs选择,例如ChatGPT、科大讯飞的星火、通义千问和文心一言等。如果你还没有尝试过这些工具,那么现在也不失为一个很好的机会,赶快体验一下吧。这些工具不仅能够为你的Java编程工作提供更多的可......
  • 35 岁实现财务自由,腾讯程序员手握2300万提前退休?
    每天行色匆匆,毫无生气的往返于公司与家的两点一线;承受着来自公司、部门的内卷,领导的PUA;相信,现下很多年轻人都会感慨什么时候才能实现财务自由,提前过上“退休生活”那么财务自由的标准是什么?最近看到一个有意思的帖子:一腾讯员工说自己35岁,存够2300万,懒得打工,提前养老退休了!引发......
  • van-dialog弹窗异步关闭-校验表单
    van-dialog弹窗异步关闭有时候我们需要通过弹窗去处理表单数据,在原生微信小程序配合vant组件中有多种方式实现,其中UI美观度最高的就是通过van-dialog嵌套表单实现。通常表单涉及到是否必填,在van-dialog的确认事件中直接return是无法阻止对话框关闭的,你需要通过异步关闭对话框的......
  • 互联网增速按下暂停键,裁员降本增效,未来Android程序员还有哪些机会?
    前言据说现在很多程序员都找不到工作了,原因相信大家都知道,就是据说互联网行业现在发展停滞了,很多公司为了降本增效,所以就拿高薪的程序员开刀,导致一下子涌现出很多失业的程序员,这些程序员一时之间无法被普通公司消化掉,从而导致了很多程序员找不到工作。但好在经过一段时间的消化,似乎......
  • 大龄,裁员,离职?程序员一定不可少的“救命”指南
    程序员只吃青春饭吗?年龄小的愁经验,年龄大经验足的愁前途,好像程序员这一行永远是个坑。就目前的市场行情来看,对大龄码农来说,确实不太友好,甚至很多岗位给出了明确的要求。35岁、行业寒冬、上有老下有小,无论哪一个标签在这个动荡的互联网时代都会成为压垮程序员的一根稻草,可是为什么?为......
  • ABAP使用异步远程RFC实现并行处理
    1、使用场景当开发复杂报表,需要处理大量数据,不管怎么优化计算和查询语句,程序的运行效率还是达不到用户要求,怎么办?为了解决这个问题,就需要程序实现并行处理。本文档就是通过异步调用远程RFC的办法,实现对大量数据的计算,以并行的方式,更快的计算出最终结果。2、代码实现在实现并......
  • element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选
    element-uitree异步树实现勾选自动展开、指定展开、指定勾选 背景项目中用到了vue的element-ui框架,用到了el-tree组件。由于数据量很大,使用了数据懒加载模式,即异步树。异步树采用复选框进行结点选择的时候,没法自动展开,官方文档找了半天也没有找到好的办法!找不到相关的配......
  • Unity-场景的异步加载
    Unity-场景的异步加载为什么需要异步加载​ 在诸多大型游戏里,场景渲染精度都是动态的,随着场景与角色距离的增加,渲染精度也在递减,这样极大的减少了硬件性能的消耗。​ 但如果角色使用了某些传送技能,将自己传送到为渲染的地点,游戏可能就会因为需要瞬间渲染大量的场景而卡顿。此时......
  • 大师学SwiftUI第9章Part 1 - 异步并发之Task、Async、Await和错误
    其它相关内容请见虚拟现实(VR)/增强现实(AR)&visionOS开发学习笔记苹果系统借助现代处理器的多核可同步执行多条代码,提升同一时间内程序所能执行的任务。例如,一段代码从网上下载文件,另一段代码可以在屏幕上显示进度。此时,我们不能等待第一个执行完后再执行第二个,而必须要同步执行这......
  • 对于目前程序员严峻的就业形势,我们应该做什么?
    @TOC前言随着互联网的快速发展,越来越多的年轻人选择从事编程行业。但也有一部分人在面对竞争激烈和多变的市场时感到迷茫。本文将介绍一些解决方案,帮助那些“就业迷茫”的人找到自己的职业方向。一、先正式自己的情况,为什么被裁的原因程序员就业形势的严峻性显而易见。我们需要首先......