一个外部接口引发的bug

上周开发上线了一个活动:从第三方点链接进入我们的站点,然后领取一个优惠券。使用微信oauth登录,每个用户可以领取一张券
周一,对方说,领取券后,需要给他们一个通知,使用URL上带的encrypt_code参数,调他们的一个接口~~三分钟,通知接口加进去了。当时也没多想:不就是调一个接口嘛
可是昨天看领取优惠券的数据时,发现有好多用户领取了不止一张,多的有三、四张。。。

分析问题,发现程序是先到mysql检查用户活动记录,如果没参加过,则新建优惠券、通知第三方、活动记录保存到数据库

逻辑很简单,怎么可能出问题。
再看活动记录:重复领取的记录,间隔的都很近,往往在1、2秒内
呵呵,猜到问题了吧~~给通知第三方加了日志,记录响应时间,。。。x,基本都在1秒以上
也就是说,用户进入页面、领券时,如果活动记录保存到数据库之前,再次进入活动页面,第二次进入的线程就查不到活动记录,还会继续发券~~不仅如此,这个接口本身,也拖慢了页面的响应时间,一般人看到时白页面,肯定会多刷几次
发现问题,基本也就解决了问题:
简单解决,将第三方通知放在保存活动记录之后
但是这样,页面响应时间慢的问题依然没有解决
所以,最终的解决方案是,将第三方通知改成异步进行~~

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

*