前言:今天有同事反映说客户在平台投标后,看到的是失败状态,但是钱在某银行的状态是被冻结了,我这边给出答复是只有投标成功才会冻结。

首先写下流程:P2P对接某银行托管,某银行的部分接口要求我们通过同步回查的方式对订单再次确认,投标是其中一个。我们这边P2P后台是5分钟查询一次金额订单表,把处理中和待处理的订单拿出来组装报文加密上送到X银行,然后根据返回数据确认是否ok?如果失败那么这笔订单关联的操作也是失败,成功则反之。

为什么需要回查呢?

  •  用户在某银行操作的时候如果超过25分钟就是失败,但25分钟内都属于处理中,需要空5分钟确认期间的状态。
  • 可能是某银行考虑到消息一致性问题,所以需要我们再请求一次确认订单,当然时间也是5分钟后。

恰巧的是今天才发现这个bug,而且是很严重的bug。因为我再次确认订单的时候,发现ctime和utime相隔1秒,但是很奇怪的用户操作哪有这么快1秒就完成了操作。再后来看到订单创建时间是12:15分,马上想起我们平台定时回查是5分钟一次,刚好满足定时任务,也就是用户刚好12:15创建了一笔订单是待处理,还没跳到某银行页面,就被我们后台定时任务扫描去了某银行,某银行返报文没有该订单,然后悲剧来了,用户高兴的投了一笔钱,回调的时候发现订单失败了,不往下走了,就这个原因导致为什么我看到投标失败了但我的钱却冻结了!

这时候不禁感觉一阵冷汗,要是以后搞什么秒杀活动,或者人气很高的时候,100个人都在定时任务扫描那个点投资出去那就悲剧了,可以想象一下100个人看到的结果都是失败,然后我们要么修改数据库,要么解冻用户钱,但带来的损失肯定没办法弥补了!

于是进行思考和查阅代码后总结了如下2点:

  • 错开定时任务扫描时间,将订单ctime推迟5分钟,这样就不会把刚创建的订单扫描进去了。但存在问题是体验感下降了,比如用户在某银行操作失败,由于推迟了 create_time,用户需要多等5分钟才能操作。
  • 通过redis重复确认,因为确实会存在订单不存在的现象,但为了防止上面说那个情况(用户还没调到某银行定时任务提前发送这种情况),根据订单号唯一性,出现订单不存在则 存到redis,然后根据现在的时间和创建时间对比一次,发现是首次回查那么就把value设置成1,不让修改失败状态, 第二次回查的再确认一次,这样比较保险,起码中间有5分钟的响应时间,这时候如果还是失败的话value应该incr成2,代表第二次回查。但第三次的时候就没必要设置value为3了,直接设置失败。

之所以不存放数据库是因为考虑到后面如果有1万这样的个订单要1万次入库,这样数据压力也会变大,而nosql是一个很好的选择。


以上是暂时想出来的2个办法,不过这肯定不是最好的办法,由于个人技术和能力有限,希望能在以后的路上通过不断实践和发现得到更多更好的办法,写下此记录用来回顾!

【原】关于定时回查出现的BUG有感的更多相关文章

  1. RocketMQ源码分析之RocketMQ事务消息实现原理中篇----事务消息状态回查

    上节已经梳理了RocketMQ发送事务消息的流程(基于二阶段提交),本节将继续深入学习事务状态消息回查,我们知道,第一次提交到消息服务器时消息的主题被替换为RMQ_SYS_TRANS_HALF_TOP ...

  2. RocketMQ事务消息回查设计方案

    用户U1从A银行系统转账给B银行系统的用户U2的处理过程如下:第一步:A银行系统生成一条转账消息,以事务消息的方式写入RocketMQ,此时B银行系统不可见这条消息(Prepare阶段) 第二步:写入 ...

  3. jquery自定义banner图滚动插件---(解决最后一张图片倒回第一张图片的bug)

    banner图的滚动效果动画 最近做项目中banner滚动的时候遇到了一个小bug,当banner滚动到最后一张图再跳回第一张图时, 会出现默认的倒回第一张图的过渡效果,看了几个插件都是这样,所以自定 ...

  4. 淘淘商城学习笔记 之 上传图片到远程服务器,图片的回显出现的bug

    最近在学习淘淘商城中用到的技术,感觉受益良多,遇到一个比较奇怪的bug调了好久,遂心乐之分享于诸君 bug情况是这样的:在商城的后台上传图片之后图片回显不出来,右键查看链接,发现链接被加了localh ...

  5. gitlab一次代码回滚引起的bug...

    问题描述:线上问题有一个bug,挺严重的.在线下排查后发现是一个之前的同事添加的代码影响的,为了不影响之前的业务,代码回滚了. 但是 过了几天,测人人员测试之后说这个问题又复现了,然后再次看,发现还是 ...

  6. celery订单定时回滚

    目录 订单回滚 控制执行(多少时间后执行) celery异步定时任务 订单回滚 用celery异步,定时任务.可以设置:如果下单15分钟后没有支付,则取消订单.做反向操作 控制执行(多少时间后执行) ...

  7. 调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令

    gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...

  8. 【原】文本图片自适应高度小bug以及解决办法

    自定义cell的文本图片自适应高度代码,如果存在自定义的cell赋值封装,就必须将自适应高度代码写在这个方法中

  9. [原]poj-2524(裸并查集)

    题目链接: http://poj.org/problem?id=2524 题意: n个人,m对人宗教相同,输出一共有多少个不同的宗教. 代码如下: #include<iostream> # ...

随机推荐

  1. POJ 1625 Censored! [AC自动机 高精度]

    Censored! Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9793   Accepted: 2686 Descrip ...

  2. Google chrome浏览器中通过扩展调用本地应用程序以及和程序相互通讯(C++)

    最近项目用到浏览插件的开发,IE用到的是BHO,chrome打算做成扩展. 但是和ie有一点不同,chrome扩展是基于html+js+css开发的,那么就会有二个问题 1. 代码和算法等容易被别人复 ...

  3. 使用netstat检测及监测网络连接

    在讲监测检测之前,先给大家在普及一个知识,那就是TCP连接的状态,TCP进行3次握手,其过程有很多状态,不同的连接状态,都有想对应的状态码,看下面列表: LISTEN:侦听来自远方的TCP端口的连接请 ...

  4. 深入cocos2d-x中的touch事件

    深入cocos2d-x中的touch事件 在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的. 我们最 ...

  5. fiddler 抓取 nodejs

      nodejs 代理指向 fiddler   var options = {       ........ }; options.path = 'http://' + options.host + ...

  6. 通过读取配置文件,启动mongodb

    在实际的项目中,经常利用mongodb数据库做缓存,mongodb的并发性比较高,所以对于快速存储.读取信息有很多优点.在项目中对于第一次的数据请求会直接访问数据库,而对于获得的信息通常都会在此时刻存 ...

  7. thinkPHP替换SQL变量

    使用tp里M()->where(pb_id=%d and course=%d and DATE_FORMAT(pub_time, \"%H:%i:%s\") < &qu ...

  8. Js常用的函数

    1.用于对正则表达式的函数: var pattern=/\d{3}-\d{2}-\d{4}/;//这里产生的是一个object类型 alert(pattern.test("cscscscs& ...

  9. 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)

    本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller 会通 ...

  10. nyoj61 传纸条(一) dp

    思路:两人一个从左上角出发只能向右和向下,另一人从右下角出发只能向左和向上,可以看做两人都是从右下角出发,且只能向左和向上传纸条,并且两条路径不会相交,因为一个人只会传一次,那么随便画一个图就能知道两 ...